前請檢查是否觸發是否有效通過焙燒下面的查詢..
SELECT *
FROM ALL_OBJECTS
WHERE OBJECT_NAME = trigger_name
AND OBJECT_TYPE = 'TRIGGER'
AND STATUS <> 'VALID'
的觸發更新後燒製.. 嘗試作爲@phonetic_man指出出門,你隱藏任何錯誤,你抓住when others
並採取任何行動。沒有異常塊,你會看到你正在引起一個變異表錯誤(ORA-04091),因爲你指的是觸發器所針對的同一個表。
如果您拿出for each row
部分將其轉換爲語句級觸發器,那麼您將避免該問題,但現在您將有一個無限循環(ORA-00036) - 當您嘗試從內部更新表觸發器,更新本身會導致同一觸發器再次觸發;它試圖再次更新同一個表,這會導致觸發器再次觸發;等到Oracle發現並殺死進程。
使用before-insert行級別觸發器來確保行的新值與您嘗試強制執行的任何模式相匹配會更有意義。也許是這樣的:
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;
/
而要看看它做什麼:
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
不知道,如果你真的打算用NULL替換集核潛艇,並把空到固定值;我懷疑你是真的想取代固定字符串設定值,獨自離開零點,在這種情況下,這將是:
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NOT NULL THEN '123-45-6789' END;
您可能還需要動議IF
外塊,所以不管它的完成電子郵件地址;我已經複製了你原來的代碼試圖做的事情,但這可能是不對的。
如果您想要修改現有數據以匹配這些更改,請對整個表執行一次性更新 - 請勿嘗試在觸發器內執行此操作。
你爲什麼捕捉到WHEN OTHERS異常,並且對此無能爲力。暫時刪除您的異常部分,並重新編譯觸發器。做一個插入/更新,看看它是否拋出任何錯誤。 –
此外,您的更新語句似乎是一個靜態更新。您沒有在觸發器中新創建或更新的記錄中使用任何值。你試圖通過這個觸發器達到什麼目的? –
@phonetic_man:在刪除異常部分後,讓我檢查您要求我做的第一個條件。我想在插入任何新記錄或任何現有記錄更新時觸發此觸發器。 –