【问题标题】:Statement Triggers on a VIEW in OracleOracle中视图上的语句触发器
【发布时间】: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_TRG1TEST_VIEW_TRG2 创建为AFTER 时,输出与预期一致:

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

这个问题有解决办法吗?

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    视图上的 INSTEAD OF 触发器始终是基于行的,如文档中所述: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 触发器语句为每一行隐式激活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多