【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください

先ほど書き込みしたものの回答が得られないので、
質問内容を少し変えます。
トリガーを作成する際に
WHEN句に書き込める制限などはあるのでしょうか?
試しに
CREATE OR REPLACE TRIGGER INS_01
AFTER INSERT
ON A_TBL
FOR EACH ROW
WHEN(NEW.ID = (SELECT ・・・))
BEGIN
・・・・
END;
/
と書いたところ
ORA-02251: ここでは副問合せは使用できません。
と怒られました。

また:NEWや:OLDの使えるはどの値を持ってくるのでしょうか?
自分はINSERT時には:NEWはVALUESの値、:OLDはNULL。
UPDATE時は:NEWはSETした値、:OLDはWHERE句で指定したレコードの値だと思っています。
間違いや補足ありましたら教えていただけると幸いです。
宜しくお願いします。

A 回答 (3件)

マニュアルを読みましたか?



マニュアルにちゃんと書いてありますよ。
> INSERT 文によって起動されるトリガーは、new 列値に対してのみ意味のあるアクセス
>を行います。行はINSERT によって作成されるため、old 値はNULL です。

通常、トリガーは、INSERTのイベントなのか、UPDATEのイベントなのかを先に判断すると思います。
故に、常識的にINSERTイベントで:NEWを参照する必要はありません。
ただ、INSERT兼UPDATEトリガのときに、イベントの判断を端折ってもそれなりに動作するような
変数値となってはいます。

手抜きでもエラーにはならないけど、手抜きが推奨されることはない。
事前に、イベントを区別するべきです。

ちなみに、マニュアルでの確認を怠るのも、プログラム作成作業に対する手抜きだと思っています。
    • good
    • 0
この回答へのお礼

すいません!
もう一度マニュアルを読み直します><

ありがとうございました。

お礼日時:2007/10/22 20:43

ここのサイトでは、「前の質問を締めずに、続きの質問をすること」は、規約違反であり、ほぼ100%削除されてしまいます。


前の質問にしても、この質問にしても、誰かがせっかくアドバイスを書き込んでくれても、質問者さんの規約違反行為により、削除されてしまいますよ?
    • good
    • 0
この回答へのお礼

すいません。。。
前の質問に回答がなく慌ててしまいました
以後気をつけます!

お礼日時:2007/10/22 20:47

>また:NEWや:OLDの使えるはどの値を持ってくるのでしょうか?



BEFOREトリガーでもAFTERトリガーでも、:OLDは当該SQL文発行直前の内容。
:NEWは、当該SQL文で指定された更新したい値を含む更新後イメージ。

例えば、Aというテーブルが
A1 A2 A3
-- -- --
11 12 13
21 22 23
だったとき
UPDATE A set A2=19 where A1=11;
で動く更新トリガー内では
:OLD.A1=11
:OLD.A2=12
:OLD.A3=13
:NEW.A1=11
:NEW.A2=19
:NEW.A3=13
の状態となります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
自分の思ったとおりでした。
セットしていないカラムの:NEWが
前の値だというのは知りませんでした。

INSERTの場合はやはり:OLDは使えないのでしょうか?
>A1 A2 A3
>-- -- --
>11 12 13
>21 22 23
INSERT INTO A(A1,A2,A3)VALUES(31,32,33);
上記のような場合はどのようになるのでしょうか?
:NEW.A1=31
:NEW.A2=32
:NEW.A3=33
:OLD.A1=???
:OLD.A2=???
:OLD.A3=???

お礼日時:2007/10/22 18:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報