2011-02-10 12 views
3

VIEWにStatementトリガーを作成できます(Rowトリガーは作成できません)。ステートメントがOracleのVIEWのトリガー

ビューでFOR EACH ROWオプションを指定しないでINSTEAD OFトリガーを作成すると、Oracleはトリガーを各行ごとに発生させます。例えば

、以下のコード:TEST_TABLE出力(代わりTEST_VIEWの)にAFTERとして

ROW TRIGGER: one 
STATEMENT TRIGGER. 
ROW TRIGGER: two 
STATEMENT TRIGGER. 
ROW TRIGGER: three 
STATEMENT TRIGGER. 
Iがトリガー TEST_VIEW_TRG1を生成

TEST_VIEW_TRG2

CREATE TABLE TEST_TABLE (
    MY_DATA VARCHAR(30) 
); 

INSERT INTO TEST_TABLE(MY_DATA) VALUES('one'); 
INSERT INTO TEST_TABLE(MY_DATA) VALUES('two'); 
INSERT INTO TEST_TABLE(MY_DATA) VALUES('three'); 

CREATE OR REPLACE VIEW TEST_VIEW AS 
    SELECT * FROM TEST_TABLE; 

CREATE OR REPLACE TRIGGER TEST_VIEW_TRG1 
    INSTEAD OF DELETE ON TEST_VIEW 
DECLARE 
BEGIN 
    Dbms_Output.Put_Line('STATEMENT TRIGGER.'); 
END; 
/

CREATE OR REPLACE TRIGGER TEST_VIEW_TRG2 
    INSTEAD OF DELETE ON TEST_VIEW FOR EACH ROW 
DECLARE 
BEGIN 
    Dbms_Output.Put_Line('ROW TRIGGER: '||:OLD.MY_DATA); 
END; 
/

DELETE FROM TEST_VIEW; 

は、以下の出力を生成します

ROW TRIGGER: one 
ROW TRIGGER: two 
ROW TRIGGER: three 
STATEMENT TRIGGER. 

この問題の回避策はありますか?

ビューに対する

答えて

9

INSTEAD OFトリガーは常に行基づいて、ドキュメントに記載されているように各ROW FOR http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2235611

を行トリガーとしてトリガーを指定各行に指定します。 Oracle Databaseは、トリガー文の影響を受け、WHEN条件で定義されているオプションのトリガー制約を満たす行ごとに1回、行トリガーを起動します。

INSTEAD OFトリガーを除いて、この句を省略すると、トリガーは文トリガーになります。 Oracle Databaseは、オプションのトリガー制約が満たされている場合にトリガー・ステートメントが発行されると、ステートメント・トリガーを1回だけ起動します。

INSTEAD OFトリガーステートメントは、行ごとに暗黙的にアクティブ化されます。

関連する問題