我正在爲公司數據庫編寫觸發器,並且此觸發器旨在更新員工的名稱(例如更改名稱的罕見情況)與前一個不同,或NOT NULL。觸發器中的更新名稱(與以前不同)SQL
這是我寫的代碼。它編譯,但它給我錯誤的更新(ORA-04091:表COMPANY.EMPLOYEE變異,觸發器/函數可能看不到 它)。我注意到這是由FOR EACH ROW
引起的,但我無法刪除,因爲否則:new
和:old
引用將不起作用。
CREATE OR REPLACE TRIGGER NO_INVALID_NAME
AFTER UPDATE OF EMPLOYEE_NAME ON EMPLYEE
FOR EACH ROW
DECLARE
INVALID_NAME EXCEPTION;
CORRECT_NAME EXCEPTION;
BEGIN
UPDATE EMPLOYEE
SET EMPLOYEE_NAME =:NEW.EMPLOYEE_NAME
WHERE EMPLOYEE_NAME =:OLD.EMPLOYEE_NAME;
IF :NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND IS NOT NULL THEN
RAISE INVALID_NAME;
ELSE
RAISE CORRECT_NAME;
END IF;
EXCEPTION
WHEN NOME_NON_CORRETTO
THEN RAISE_APPLICATION_ERROR(-20009,'Name cannot be updated.');
WHEN CORRECT_NAME
THEN DBMS_OUTPUT.PUT_LINE('Updated.');
END;
我想我搞亂了:NEW和:OLD聲明,但我看不到在哪裏。
你檢查過嗎? [Oracle文檔](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS2005) – SlimsGhost
我已經諮詢了很多文檔,但也許你可以建議我一些頁面應該爲我的代碼做訣竅? – smartsoap
我不明白這裏的商業規則。爲什麼更新觸發器試圖更新自己的表?爲什麼'employee_name'允許爲空?如果要防止更改名稱,那麼只需引發一個異常'if:new.employee_name <>:old.employee_name'。如果名稱允許更改,那麼觸發器是什麼? –