2016-05-21 8 views
0

Hallo Ich habe ein Problem, während ich einen Trigger auf SQL Oracle erstellen.Fehler bei Trigger SQL Oracle

Meine Trigger ist:

create or replace trigger generatePassword 
before insert on people 
for each row 
begin 
    insert into people(nif,naame,date_birth,sex,adress,email,iban,password) 
    values (:NEW.nif,:NEW.naame,:NEW.date_birth,:NEW.sex,:NEW.adress,:NEW.email,:NEW.iban,(select round(dbms_random.value(0000,9999)) from dual)); 
end; 
/

Der Trigger erfolgreich erstellt wurde. Dann, wenn ich versuche, den Befehl auszuführen:

insert into people (naame, date_birth, sex, adress, email, iban, nif, id) values ('Albert', '01-12-87', 'M', 'NY', '[email protected]', '000032134537512343231', '523456189', '70'); 

ich diesen Fehler:

ORA-00036: maximum number of recursive SQL levels (50) exceeded ORA-06512: at "UTF8.GENERATEPASSWORD", line 2 ORA-04088: error during execution of trigger 'UTF8.GENERATEPASSWORD' ORA-06512: at "UTF8.GENERATEPASSWORD", line 2 ORA-04088: error during execution of trigger 'UTF8.GENERATEPASSWORD' ORA-06512: at "UTF8.GENERATEPASSWORD", line 2 ORA-04088: error during execution of trigger 'UTF8.GENERATEPASSWORD' ORA-06512: at "UTF8.GENERATEPASSWORD", line 2 ORA-04088: error during execution of trigger '

Was ist das Problem hier?

+2

Mögliches Duplikat von [PLSQL - Iinsert im Auslöser, der rekursive Schleife verursacht] (http://stackoverflow.com/questions/26851810/plsql-iinsert-in-trigger-causing-recursive-loop) – fvu

+0

Was versuchen Sie zu erreichen ? Wenn ein Trigger auf 'people' versucht, in' people' einzufügen, wirst du in eine endlose Schleife geraten (die anfängliche Einfügung löst den Trigger aus, der eine neue Zeile einfügt, die den Trigger erneut auslöst, der eine neue Zeile einfügt, die die trigger erneut ...). Wenn Sie nur versuchen, den 'Passwort'-Wert von der ursprünglichen Einfügung zu ändern, möchten Sie einfach': new.password: = round (dbms_random.value (0000.9999);.) –

+0

Justin, meinst du so : 'Erstelle oder Trigger Gene vor Einsatz an Menschen für jede Zeile beginnen ersetzen: NEW.password = (round (dbms_random.value (0000,9999)) aus dual; Einsatz in Menschen (NIF, naame, date_birth, sex, adresse, email, iban, passwort) werte (: NEW.nif,: NEW.naame,: NEW.date_birth,: NEW.sex,: NEW.adress,: NEW.email,: NEW.iban, : NEW.password); end; / ' – Blackout

Antwort

1

Wie bereits von Justin darauf hingewiesen wurde, erzeugt Ihr Code eine Endlosschleife, da der Auslöser für jede insert-Anweisung die im Trigger enthaltene auslöst. Eine mögliche Lösung ist diese:

CREATE OR REPLACE TRIGGER generatePassword 
BEFORE INSERT ON people 
FOR EACH ROW 

BEGIN 
:NEW.password := round(dbms_random.value(0000,9999); 

END generatePassword; 
/

Jedes Mal, wenn der Trigger ausgelöst, ein Passwort erzeugt wird und zu der ursprünglichen Insert-Anweisung.