我在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
有人有想法吗?
编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图的约束。
答案 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
而不是:old
和null
的视图