是否可以在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_TRG2为AFTER上TEST_TABLE(而不是一个TEST_VIEW)如预期的输出:
ROW TRIGGER: one
ROW TRIGGER: two
ROW TRIGGER: three
STATEMENT TRIGGER.
Run Code Online (Sandbox Code Playgroud)
这个问题有解决方法吗?
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触发器语句.
| 归档时间: |
|
| 查看次数: |
19210 次 |
| 最近记录: |