语句在Oracle中的VIEW上触发

Vol*_*lov 3 oracle triggers

是否可以在Oracle DB中创建Statement触发器(但不是Row触发器)VIEW

当我在视图上创建INSTEAD OF没有FOR EACH ROW选项的触发器时,Oracle会以任何方式触发每行的触发器.

例如,以下代码:

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;
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

ROW TRIGGER: one
STATEMENT TRIGGER.
ROW TRIGGER: two
STATEMENT TRIGGER.
ROW TRIGGER: three
STATEMENT TRIGGER.
Run Code Online (Sandbox Code Playgroud)

当我创建触发器TEST_VIEW_TRG1,并TEST_VIEW_TRG2AFTERTEST_TABLE(而不是一个TEST_VIEW)如预期的输出:

ROW TRIGGER: one
ROW TRIGGER: two
ROW TRIGGER: three
STATEMENT TRIGGER.
Run Code Online (Sandbox Code Playgroud)

这个问题有解决方法吗?

Mic*_*ton 9

INSTEAD OF视图上的触发器总是基于行的,如文档中所述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2235611

FOR EACH ROW指定FOR EACH ROW将触发器指定为行触发器.Oracle数据库为受触发语句影响的每一行触发一次行触发器,并满足WHEN条件中定义的可选触发器约束.

除INSTEAD OF触发器外,如果省略此子句,则触发器是语句触发器.如果满足可选的触发器约束,则在发出触发语句时,Oracle数据库仅触发一次语句触发器.

对每一行隐式激活INSTEAD OF触发器语句.