Oracle触发器允许在视图上使用DML

时间:2015-05-05 16:38:18

标签: sql database oracle view triggers

我在Oracle DB中有View:

color

public enum Candy { RED,BLUE,GREEN; } 的列为id,c1,... c9。 现在我想要在这个视图上设置触发器,以允许数据存储的DML操作不在此视图中。但我不知道whitch列将被更新,删除或插入行。例如

  CREATE VIEW view1
AS SELECT
  id, c1, c2, c3, c4, c5, c6
FROM
  table1
WHERE
  c1>1100 AND c1<2000
WITH CHECK OPTION;

table1

有人有想法吗?

编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图的约束。

2 个答案:

答案 0 :(得分:0)

您似乎试图通过视图插入/更新,同时绕过视图强加的约束 - 这似乎没有多大意义。无论哪种方式,我都不相信你需要在这里使用另一种解决方法,如触发器。

一般情况下,由于您的视图仅使用一个表格,因此您可以在没有触发器等的情况下通过视图进行更新,前提是您保持在CHECK OPTION的{​​{1}}范围内:

c1 (i.e. between 1100 and 2000)

但不是这样:

INSERT INTO view1(c1, ...) 
VALUES (1101, );

UPDATE view1 
SET c1 = 1102 
WHERE id = 1;

但是,如果您想绕过约束,您可以:

  • 直接插入/更新表格(即UPDATE view1 SET c1 = 23 WHERE id = 1; -- ORA-01402: view WITH CHECK OPTION where-clause violation
  • 创建另一个没有update table1 set c1 = 23 where ...过滤器和WHERE的视图,然后通过此更新(但同样,为什么?)

我添加了一个显示上述方法的SqlFiddle here

答案 1 :(得分:0)

所以这是删除的解决方案:

CREATE OR REPLACE TRIGGER DML_VIEW_DELETE
    INSTEAD OF DELETE ON myview
BEGIN
    DELETE table
    WHERE id = :old.id;
END;

类似的更新和仅在:new而不是:oldnull的视图

中的列中插入