ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3450982 トリガーの起動条件で悩んでいます。
質問者:sevenkool 超初心者です。
うまく説明できないかも知れませんが助けて下さい。

うまく動作しない処理は、
[A_TBL]が更新時に履歴あり・なしにそれぞれトリガーを用意しているのですが、
履歴なしの場合は[A_TBL]がUPDATEされるだけなので、
『[A_TBL]がUPDATEされたタイミングで[B_TBL]もUPDATEする』
という起動条件にしています。
履歴ありの場合は[A_TBL]のデータをUPDATEで無効化(FLGを立てます)し、
その後、更新データをINSERTで登録しようと思っています。
そのためトリガーの起動条件を、
『[A_TBL]がINSERTされたタイミングで[B_TBL]のデータをUPDATEする』
としていますが、

[A_TBL]に新規登録時のトリガーの起動条件が、
『[A_TBL]にINSERTされたタイミングで[B_TBL]にもINSERTする』
としているので、
[A_TBL]にINSERTされると両方のトリガーが起動してしまい、
怒られました。

自分の作ったトリガーを書いておくので
どのようにしたらよいのか教えていただけませんでしょうか?
トリガーの書き方におかしな点があったらご指摘もお願い致します。
よろしくお願いしますm(_ _)m

新規登録のトリガー
CREATE OR REPLACE TRIGGER INS_01
AFTER INSERT
ON A_TBL
FOR EACH ROW
BEGIN
INSERT INTO
B_TBL(
ID,
姓,
名,
住所,
本籍,
電話番号,
郵便番号
)VALUES(
:NEW.ID,
:NEW.姓,
:NEW.名,
:NEW.住所,
:NEW.本籍,
:NEW.電話番号,
:NEW.郵便番号
);
END;
/

更新のトリガー
CREATE OR REPLACE TRIGGER UP_01
AFTER INSERT
ON A_TBL
FOR EACH ROW
BEGIN
UPDATE
B_TBL
SET
姓 = :NEW.姓,
名 = :NEW.名,
住所 = :NEW.住所,
本籍 = :NEW.本籍,
電話番号 = :NEW.電話番号,
郵便番号 = :NEW.郵便番号
WHERE
ID = :NEW.ID
;
END;
/
困り度:
  • 困っています
質問投稿日時:
07/10/22 11:33
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.1 やりたいことがイマイチ理解できないけれど、質問を読む限り、
A_TBLへINSERTする動機が2種類あって、いずれかを行う。
(1)A_TBLへのインサート、B_TBLのアップデート
(2)A_TBLへのインサート、B_TBLへのインサート

これが、A_TBLへのINSERTする動機にあたる部分が、A_TBLへの登録内容(値)で区別できるなら、
A_TBLのインサートトリガを2つ作るのでなく、1つに纏めて、B_TBLのINSERT/UPDATEを区分けすれば
良いでしょう。
A_TBLへINSERTする動機がA_TBLの内容で区別できないなら、A_TBLへINSERTする動機そのものに
B_TBLへの更新を紐付ける方が自然だと思います。
回答者:k_o_r_o_c_h_a_n
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
07/10/22 19:39
この回答へのお礼なるほど。。。
やってみます。
ありがとうございました!