Andreas Kretschmer schrieb:
Oliver Kamzol <itsok@okamzol.de> schrieb:
  
Funktioniert. Aber ich möchte jetzt gerne, daß das pw Feld per crypt
verschlüsselt wird, auch wenn die Applikation nur plain übergibt, also
nur 'me' und 'pass'. Also dachte ich, ich kann das mit einer Regel lösen:

=> CREATE RULE pw_tt AS ON INSERT TO tt
-> DO INSTEAD
-> INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));
CREATE RULE

=> insert into tt values ('me', 'pass');
FEHLER:  unendliche Rekursion entdeckt in Regeln für Relation »tt«


Kann mir bitte jemand erklären, wo hier der Fehler liegt? Ich schein
betriebsblind zu sein, aber ich weiß nicht, woher er die Rekursionen holt...
    

Die RULE macht bei insert ein instead insert. Die Rule für das Insert
ist wieder ein... richtig, insert.

Ich würde das eher als TRIGGER machen.
  
Das hab ich auch schon versucht, leider bekomme ich hierbei auch einen Fehler...
Etwas anders gestaltet, aber doch ähnlich.

=>CREATE OR REPLACE FUNCTION makePwd() returns trigger AS
$> $$
$> BEGIN
$>  IF TG_OP = 'INSERT' THEN
$>  INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));
$> RETURN NEW;
$>  END IF;
$> END;
$> $$ LANGUAGE 'plpgsql';
CREATE FUNCTION
=> create trigger pwdtest before insert on tt for each row execute procedure makePwd();
CREATE TRIGGER
=> insert into tt values ('me', 'pass');
-- hier passiert erstmal einige Sekunden nichts und dann:
FEHLER:  Grenze für Stacktiefe überschritten
TIP:  Erhöhen Sie den Konfigurationsparameter »max_stack_depth«, nachdem Sie sichergestellt haben, dass die Stacktiefenbegrenzung Ihrer Plattform ausreichend ist.
KONTEXT:  SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«
PL/pgSQL function "makepwd" line 3 at SQL statement
SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«
PL/pgSQL function "makepwd" line 3 at SQL statement
SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«
[...]

das ganze dann zig Mal.

Ich verstehe nicht, warum das mit der Stacktiefe zu tun hat - die übrigens auf dem Default steht.

Gruß & Danke
 Oliver




Andreas
  


--
its ok :: it service oliver kamzol

Oliver Kamzol
Heiligenbaumstr. 15
47249 Duisburg
email: itsok@okamzol.de
mobile: +49 151 226 324 84