することはでき通知の場合、"挿入や更新のトリガ'が停止します。
-
16-10-2019 - |
質問
先週かったので after insert or update trigger
ん。後障害者および有効で働き始めました。
まだ知らないのはなぜで停止します。必要があります。に対す。このトリガー記録の値を日々の仕事などに使われています。報告す。このトリガーが死亡し、数日でずっ告やエラーなります。
を使用していOracle10g、アクセスのdbを利用sqldeveloper
My Trigger
create or replace
TRIGGER MASTER.INSTANCE_STEP_TRG
AFTER INSERT OR UPDATE OF SYSID,STEP_ID,INSTANCE_ID,PARENT_STEP_ID ON MASTER.WF_INSTANCE_STEP
REFERENCING OLD AS old NEW AS new
FOR EACH ROW
WHEN (new.sysid > 0)
declare
stepSysid number;
crCode varchar(50);
crDate date;
step_id number;
BEGIN
step_id := :new.step_id;
select ss.sysid into stepSysid from TEMPLATE.wf_step ws
inner join TEMPLATE.step_stage ss on ss.sysid=ws.stage_id
where ws.sysid= step_id;
if ( stepSysid>0) then
insert into MASTER.fact_cr_progress values(0,:new.instance_id,stepSysid,:new.create_dt);
end if;
dbms_output.enable(10000);
dbms_output.put_line('start print');
END;
解決
トリガーは単に動作を停止することはできません。
トリガーを無効にすることができます。トリガーをドロップできます。 DDLが参照されるオブジェクトの1つに対してDDLが実行されるとトリガーが無効になりますが、トリガーステートメントが実行された場合でも実行されます。トリガーが正常に再コンパイルできない場合、トリガーステートメントはエラーが発生します
ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation
また、トリガーが宣言されたとおりに正しく機能していた可能性もありますが、意図したとおりではありません。たとえば、new.sysidが0以下ではなかった可能性があります(nullが0より大きくないことを忘れない) WHEN
満たされない条項。それはおそらくあなたのものです SELECT
ステートメントは0以下の値を0以下に返し、したがってあなたを引き起こします INSERT
実行されない。どちらかの場合 TEMPLATE.wf_step
また TEMPLATE.step_stage
列があります STEP_ID
, 、 WHERE
句
where ws.sysid= step_id;
解釈します STEP_ID
テーブルの列として、ローカル変数ではありません STEP_ID
. 。 PL/SQL開発者が一般的にローカル変数にプレフィックスを追加する理由の1つ(つまり、 L_STEP_ID
それよりも STEP_ID
)この種のスコープ解像度の問題はデバッグが難しいことで有名であるため、テーブルの列でも使用される名前を誤って使用することを避けるためです。
他のヒント
これによりそのトリガ'が停止'.
場でトリガされるものになるので、きめ細やかなケアを行っていを入れているトリガーメッセージ EXCEPTION
ブロックです。
の場合は無効に間違いがあるという特性が正の場合で走る(例えば、私は一部トリガーするの移植の実現がることは難しい計算ができます。いcronジョブするかどうかをチェックした時は直近の記録にテーブルの場合でも、報告を行います。ない場合も明らかなように、常にテーブルをならべるだけで追跡がトリガーの最後の行、更新するとともにw/の現在の時刻です。
もちろん、もしこの人の助け合いジャスティン洞窟記のコマンドにおいて誤解を招くおそれのための変数名。きち else
の if ( stepSysid>0)
支店および報告のありかすことのできないなどが実際に起こるのよ。