我在 Oracle 数据库中有 View :
CREATE VIEW view1
AS SELECT
id, c1, c2, c3, c4, c5, c6
FROM
table1
WHERE
c1>1100 AND c1<2000
WITH CHECK OPTION;
表 table1
包含列 id、c1、... c9。
现在我想在此 View 上创建触发器,以允许对不在此 View 中的数据进行 DML 操作。但我不知道哪些列会被更新,哪些行会被删除或插入。例如
UPDATE view1 SET c1=3000 WHERE c1=1500;
或
INSERT INTO view1 VALUES(3500, .......);
有人有想法吗?
编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过 View 的约束。
最佳答案
您似乎正试图通过 View 插入/更新,同时绕过 View 强加的约束 - 这似乎没有多大意义。无论哪种方式,我认为您不需要使用其他解决方法,例如此处的触发器。
一般来说,由于您的 View 仅使用一个表,因此您可以在不使用触发器等的情况下通过 View 进行更新,前提是您保持在 c1 的
:CHECK OPTION
范围内(即在 1100 之间)和 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
过滤器和CHECK CONSTRAINT
的 View ,然后通过它进行更新(但同样,为什么?)
我添加了一个 SqlFiddle here显示上述方法
关于sql - 允许查看 DML 的 Oracle 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058622/