【发布时间】:2011-06-24 23:03:28
【问题描述】:
在 Oracle DB 中是否可以在 VIEW 上创建语句触发器(但不是行触发器)?
当我在视图上创建没有FOR EACH ROW 选项的INSTEAD OF 触发器时,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;
产生以下输出:
ROW TRIGGER: one
STATEMENT TRIGGER.
ROW TRIGGER: two
STATEMENT TRIGGER.
ROW TRIGGER: three
STATEMENT TRIGGER.
当我在TEST_TABLE(而不是TEST_VIEW)上将TEST_VIEW_TRG1 和TEST_VIEW_TRG2 创建为AFTER 时,输出与预期一致:
ROW TRIGGER: one
ROW TRIGGER: two
ROW TRIGGER: three
STATEMENT TRIGGER.
这个问题有解决办法吗?
【问题讨论】: