sql - 允许查看 DML 的 Oracle 触发器

标签 sql database oracle view triggers

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

相关文章:

mysql - 在数据库中存储 json 的正确方法

sql - 需要SQL查询以查找没有子记录的父记录

使用 Inner Join 的 MySQL 查询返回存储过程中的所有记录

oracle - 在 Oracle Forms 中评估 PL/SQL boolean 变量

java - JDBC preparedStatement.executeBatch() 的终止条件

mysql - 在 MySql 中执行查询时与 only_full_group_by 相关的错误

SQL连接两个表

database - 如何将 Scylla DB 中的计数器列重置为零?

mysql - 备份与 MySQL 特定用户相关的所有权限

oracle - plsql累积乘法