gpt4 book ai didi

oracle - Oracle中 View 上的语句触发器

转载 作者:行者123 更新时间:2023-12-01 09:07:35 24 4
gpt4 key购买 nike

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

当我在 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) 输出如预期:

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

这个问题有解决办法吗?

最佳答案

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

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

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

INSTEAD OF 触发器语句为每一行隐式激活。

关于oracle - Oracle中 View 上的语句触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com