私は会社のデータベースのトリガを作成していますが、このトリガは名前を変更する(まれに名前を変更する場合など)前のものと違うか、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 Docs](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS2005) – SlimsGhost
私は多くのドキュメントを参考にしましたが、私のコードのためのトリックを行う必要がありますか? – smartsoap
ここではビジネスルールを理解できません。更新トリガーが独自のテーブルを更新しようとしているのはなぜですか? 'employee_name'はなぜnullになるのですか?名前の変更を防止したい場合は、単に例外:if:new.employee_name <>:old.employee_name'を発生させてください。名前の変更が許可されている場合、トリガーは何ですか? –