允许查看 DML 的 Oracle 触发器

Oracle trigger for allowing DML on view

我在 Oracle 数据库中有视图:

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

和 table table1 列 id,c1,... c9。 现在我想在此视图上创建触发器,以允许对不在此视图中的数据进行 DML 操作。但我不知道哪些列会被更新,哪些行会被删除或插入。例如

UPDATE view1 SET c1=3000 WHERE c1=1500;

INSERT INTO view1 VALUES(3500, .......);

有人有想法吗?

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

您似乎试图通过视图插入/更新,同时绕过视图强加的约束 - 这似乎没有多大意义。无论哪种方式,我认为您不需要使用其他解决方法,例如此处的触发器。

一般来说,由于您的视图仅使用一个 table,您可以在不使用触发器等的情况下通过视图进行更新,前提是您保持在 c1 (i.e. between 1100 and 2000)CHECK OPTION 范围内:

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

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

  • 直接插入/更新到 table(即 update table1 set c1 = 23 where ...
  • 在没有 WHERE 过滤器和 CHECK CONSTRAINT 的情况下创建另一个视图,然后通过它进行更新(但同样,为什么?)

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

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

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

类似的更新和插入仅使用 :new 而不是 :oldnull 在不在视图中的列中