Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 允许查看DML的Oracle触发器_Sql_Database_Oracle_View_Triggers - Fatal编程技术网

Sql 允许查看DML的Oracle触发器

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; 或 有人有主意吗 编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图约束。似乎您正试图通过视图插入/更新,同时绕过视图施加的约束-这似乎没有多大意义。不管怎样,我不认为你需要在这里使用另

我在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;

有人有主意吗


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

似乎您正试图通过视图插入/更新,同时绕过视图施加的约束-这似乎没有多大意义。不管怎样,我不认为你需要在这里使用另一种解决方法,比如触发器

通常,由于您的视图只使用一个表,您可以在不使用触发器等的情况下通过视图进行更新,前提是您保持在
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;