前..更新後 試みを発射ます。..
SELECT *
FROM ALL_OBJECTS
WHERE OBJECT_NAME = trigger_name
AND OBJECT_TYPE = 'TRIGGER'
AND STATUS <> 'VALID'
をチェックあなたは、when others
を捕まえて何もしないで、どんなエラーも隠しています。例外ブロックがないと、トリガーと同じ表を参照しているため、変換表エラー(ORA-04091)が発生していることがわかります。
for each row
部分を取り出して文レベルのトリガーにすると、その問題は回避されますが、今度は無限ループ(ORA-00036)が発生します.-表を内部から更新しようとするとそのトリガは、それ自身を更新して同じトリガを再び発動させます。同じテーブルを再度更新しようとすると、トリガーがもう一度起動します。 Oracleがプロセスに気付いてプロセスを終了するまで、
挿入前の行レベルのトリガを使用して、行の新しい値が、実行しようとしているパターンに一致することを確認するのが理にかかります。多分何かのように:
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をヌルとセットのSSNを交換し、有効にすることを意図している場合。私はそれは次のようになり、その場合には、あなたが本当に固定文字列で設定値を置き換えるためにしようとしている疑いがあると一人でヌルを残し:
:NEW.ssn_nb := CASE WHEN :NEW.ssn_nb IS NOT NULL THEN '123-45-6789' END;
それは関係なく、行われていますので、あなたはまた、IF
ブロックの外側それを移動したい場合があります電子メールアドレス。元のコードがやろうとしていたことを再現しましたが、それは正しいとは限りません。
これらの変更に合わせて変更する既存のデータがある場合は、テーブル全体を1回限りの更新で実行します。トリガー内でそのデータを更新しようとしないでください。
なぜWHEN OTHERS例外をキャッチして何もしません。当面はあなたの例外セクションを完全に削除し、トリガーを再コンパイルしてください。挿入/更新を行い、エラーが発生していないか確認してください。 –
また、更新ステートメントは静的な更新プログラムのようです。トリガーで新しく作成または更新されたレコードの値を使用していません。このトリガーで達成しようとしていることは何ですか? –
@phonetic_man:例外セクションを削除した後に、私があなたに求めた最初の条件をチェックしましょう。新しいレコードが挿入されたり、既存のレコードが更新されたりすると、このトリガを起動します。 –