2009-09-04 9 views
4

行レベルのトリガをOracleに書き込むときに、OLDNEW疑似レコードを使用して、トリガを起動した行の古い状態と新しい状態を参照できることがわかりました。
INSERTトリガーOLDにはデータが含まれていませんが、このトリガーに対するWHEN句の評価にどのように影響するかはわかりません。私は、次のトリガーがある場合たとえば、:OLDへの参照は、Oracle挿入トリガのWHEN原因で何を評価するのですか?

CREATE OR REPLACE TRIGGER mung_row 
BEFORE INSERT OR UPDATE ON some_table 
FOR EACH ROW 
BEGIN 
    :NEW.foo = 'some val'; 
END; 

を、私はfooが以前にnullをしたときにのみ更新時に実行するには、このトリガーを変更するが、常に挿入時に実行したい、私はの更新部分を満たすことができWHERE句を追加して変更しました。

CREATE OR REPLACE TRIGGER mung_row 
BEFORE INSERT OR UPDATE ON some_table 
FOR EACH ROW 
WHEN (OLD.foo IS NULL) 
BEGIN 
    :NEW.foo = 'some val'; 
END; 

これは、挿入時に問題が発生しますか?でOLD.fooは何を評価しますか?

私はINSERTUPDATEトリガーを分割したり、トリガー本体にINSERTING/UPDATING/DELETINGを使用することができることを認識してんだけど、私はこの質問にインスピレーションを与えた場合にはむしろないと思います。

答えて

9

レコードが挿入されるとき、OLDのすべてのフィールドはと表記されたフィールドを含むNULLになります。例えば

、あなたのテーブルにはidという名前の非NULL可能列があるとします

CREATE TABLE some_table (
    id NUMBER NOT NULL, 
    foo VARCHAR2(100) 
) 

レコードがこのテーブルに挿入されると、OLD.idNULLになります。ただし、この表でレコードが更新されると、OLD.idNULLになりません。レコードが更新されている場合にのみ:NEW.fooを変更したいので、OLD.idにnull以外の値があるかどうかを確認する必要があります。

CREATE OR REPLACE TRIGGER mung_row 
BEFORE INSERT OR UPDATE ON some_table 
FOR EACH ROW 
WHEN (OLD.id IS NOT NULL AND OLD.foo IS NULL) 
BEGIN 
    :NEW.foo = 'some val'; 
END; 
関連する問題