Sql 允许查看DML的Oracle触发器
我在Oracle DB中有以下视图:Sql 允许查看DML的Oracle触发器,sql,database,oracle,view,triggers,Sql,Database,Oracle,View,Triggers,我在Oracle DB中有以下视图: CREATE VIEW view1 AS SELECT id, c1, c2, c3, c4, c5, c6 FROM table1 WHERE c1>1100 AND c1<2000 WITH CHECK OPTION; 或 有人有主意吗 编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图约束。似乎您正试图通过视图插入/更新,同时绕过视图施加的约束-这似乎没有多大意义。不管怎样,我不认为你需要在这里使用另
CREATE VIEW view1
AS SELECT
id, c1, c2, c3, c4, c5, c6
FROM
table1
WHERE
c1>1100 AND c1<2000
WITH CHECK OPTION;
或
有人有主意吗
编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图约束。似乎您正试图通过视图插入/更新,同时绕过视图施加的约束-这似乎没有多大意义。不管怎样,我不认为你需要在这里使用另一种解决方法,比如触发器 通常,由于您的视图只使用一个表,您可以在不使用触发器等的情况下通过视图进行更新,前提是您保持在
c1的检查选项范围内(即1100到2000之间)
:
但不是这个:
UPDATE view1
SET c1 = 23
WHERE id = 1;
-- ORA-01402: view WITH CHECK OPTION where-clause violation
但是,如果要绕过约束,可以:
- 直接插入/更新表格(即,
更新表格1集合c1=23,其中…
)
- 创建另一个没有
WHERE
过滤器和检查约束的视图,然后通过该视图进行更新(但同样,为什么?)
我添加了一个示例,显示了上述方法,因此下面是删除的解决方案:
CREATE OR REPLACE TRIGGER DML_VIEW_DELETE
INSTEAD OF DELETE ON myview
BEGIN
DELETE table
WHERE id = :old.id;
END;
更新和插入类似,只使用:new
而不是:old
,并且在视图中不存在的列中使用null
,我知道,这毫无意义,但这是我项目的一部分,展示了如何绕过视图约束,我不知道如何实现它。我不知道如何开始,或者先做什么。。。
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
CREATE OR REPLACE TRIGGER DML_VIEW_DELETE
INSTEAD OF DELETE ON myview
BEGIN
DELETE table
WHERE id = :old.id;
END;