Wie @phonetic_man hingewiesen out, verstecken Sie alle Fehler, die Sie bekommen, indem Sie when others
fangen und keine Maßnahmen ergreifen. Ohne den Ausnahmeblock würden Sie sehen, dass Sie einen mutierenden Tabellenfehler verursachen (ORA-04091), weil Sie sich auf die gleiche Tabelle beziehen, gegen die der Trigger gerichtet ist.
Wenn Sie den for each row
Teil herausgenommen haben, um ihn in einen Auslöser auf Anweisungsebene zu verwandeln, würden Sie dieses Problem vermeiden, aber jetzt hätten Sie eine Endlosschleife (ORA-00036) - wenn Sie versuchen, die Tabelle von innen zu aktualisieren der Auslöser, der selbst aktualisiert, bewirkt, dass derselbe Auslöser erneut ausgelöst wird; die versucht, die gleiche Tabelle noch einmal zu aktualisieren, wodurch der Auslöser erneut ausgelöst wird; usw., bis Oracle den Prozess bemerkt und beendet.
Es wäre sinnvoller, einen Trigger auf Zeilenebene vor dem Einfügen zu verwenden, um sicherzustellen, dass die neuen Werte für die Zeile mit dem Muster übereinstimmen, das Sie erzwingen möchten. Vielleicht so etwas wie:
CREATE OR REPLACE TRIGGER ref_upd_user_phi_details
BEFORE INSERT OR UPDATE --of emp_email_address, ssn_nb
ON ref_adp_employees
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
IF upper(:NEW.emp_email_address) NOT LIKE 'QA_%'
AND upper(:NEW.emp_email_address) LIKE '%@KEENAN.COM'
THEN
:NEW.emp_email_address := 'QA_' || :NEW.emp_email_address;
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NULL THEN '123-45-6789' END;
END IF;
END;
/
Und um zu sehen, was es tut:
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (1, 'TEST_1', '123-45-6789');
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (2, '[email protected]', '123-45-9876');
insert into ref_adp_employees (emp_id, emp_email_address, ssn_nb) values (3, 'QA_TEST_1', null);
select emp_id, emp_email_address, ssn_nb from ref_adp_employees;
EMP_ID EMP_EMAIL_ADDRESS SSN_NB
---------- ------------------------------ -----------
1 TEST_1 123-45-6789
2 [email protected]
3 QA_TEST_1
Nicht sicher, ob Sie wirklich Set SSNs mit null und schalten nulls in den festen Wert ersetzen soll; Ich vermute, dass Sie wirklich Sollwerte mit dem festen Zeichenfolge zu ersetzen versuchen und Blätter nulls allein, in diesem Fall wäre es:
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NOT NULL THEN '123-45-6789' END;
Vielleicht möchten Sie auch bewegen, dass außerhalb des IF
Block, so ist es geschafft, unabhängig davon, Die E-Mail Adresse; Ich habe repliziert, was Ihr ursprünglicher Code versucht hat, aber das könnte nicht richtig sein.
Wenn vorhandene Daten geändert werden müssen, um diese Änderungen zu berücksichtigen, führen Sie eine einmalige Aktualisierung der gesamten Tabelle durch - versuchen Sie nicht, dies innerhalb eines Triggers zu tun.
Warum fangen Sie die Ausnahme WHEN OTHERS ab und tun nichts dagegen. Entfernen Sie vorerst Ihren Ausnahmeabschnitt und kompilieren Sie den Trigger erneut. Führen Sie eine Einfügung/Aktualisierung durch und prüfen Sie, ob ein Fehler vorliegt. –
Auch Ihre Update-Anweisung scheint ein statisches Update zu sein. Sie verwenden keine Werte in dem neu erstellten oder aktualisierten Datensatz in Ihrem Trigger. Was genau willst du mit diesem Auslöser erreichen? –
@phonetic_man: Lassen Sie mich die erste Bedingung überprüfen, nach der Sie mich gefragt haben, nachdem Sie den Ausnahmeabschnitt entfernt haben. Ich möchte diesen Trigger auslösen, wenn ein neuer Datensatz eingefügt oder ein vorhandener Datensatz aktualisiert wird. –