允许查看 DML 的 Oracle 触发器
Oracle trigger for allowing DML on view
我在 Oracle 数据库中有视图:
CREATE VIEW view1
AS SELECT
id, c1, c2, c3, c4, c5, c6
FROM
table1
WHERE
c1>1100 AND c1<2000
WITH CHECK OPTION;
和 table table1
列 id,c1,... c9。
现在我想在此视图上创建触发器,以允许对不在此视图中的数据进行 DML 操作。但我不知道哪些列会被更新,哪些行会被删除或插入。例如
UPDATE view1 SET c1=3000 WHERE c1=1500;
或
INSERT INTO view1 VALUES(3500, .......);
有人有想法吗?
编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图的约束。
您似乎试图通过视图插入/更新,同时绕过视图强加的约束 - 这似乎没有多大意义。无论哪种方式,我认为您不需要使用其他解决方法,例如此处的触发器。
一般来说,由于您的视图仅使用一个 table,您可以在不使用触发器等的情况下通过视图进行更新,前提是您保持在 c1 (i.e. between 1100 and 2000)
的 CHECK OPTION
范围内:
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
但是,如果您想绕过约束,您可以:
- 直接插入/更新到 table(即
update table1 set c1 = 23 where ...
)
- 在没有
WHERE
过滤器和 CHECK CONSTRAINT
的情况下创建另一个视图,然后通过它进行更新(但同样,为什么?)
我添加了 SqlFiddle here 显示上述方法
所以这是删除的解决方案:
CREATE OR REPLACE TRIGGER DML_VIEW_DELETE
INSTEAD OF DELETE ON myview
BEGIN
DELETE table
WHERE id = :old.id;
END;
类似的更新和插入仅使用 :new
而不是 :old
和 null
在不在视图中的列中
我在 Oracle 数据库中有视图:
CREATE VIEW view1
AS SELECT
id, c1, c2, c3, c4, c5, c6
FROM
table1
WHERE
c1>1100 AND c1<2000
WITH CHECK OPTION;
和 table table1
列 id,c1,... c9。
现在我想在此视图上创建触发器,以允许对不在此视图中的数据进行 DML 操作。但我不知道哪些列会被更新,哪些行会被删除或插入。例如
UPDATE view1 SET c1=3000 WHERE c1=1500;
或
INSERT INTO view1 VALUES(3500, .......);
有人有想法吗?
编辑:我知道,这没有意义,但这是我项目的一部分,这部分将展示如何绕过视图的约束。
您似乎试图通过视图插入/更新,同时绕过视图强加的约束 - 这似乎没有多大意义。无论哪种方式,我认为您不需要使用其他解决方法,例如此处的触发器。
一般来说,由于您的视图仅使用一个 table,您可以在不使用触发器等的情况下通过视图进行更新,前提是您保持在 c1 (i.e. between 1100 and 2000)
的 CHECK OPTION
范围内:
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
但是,如果您想绕过约束,您可以:
- 直接插入/更新到 table(即
update table1 set c1 = 23 where ...
) - 在没有
WHERE
过滤器和CHECK CONSTRAINT
的情况下创建另一个视图,然后通过它进行更新(但同样,为什么?)
我添加了 SqlFiddle here 显示上述方法
所以这是删除的解决方案:
CREATE OR REPLACE TRIGGER DML_VIEW_DELETE
INSTEAD OF DELETE ON myview
BEGIN
DELETE table
WHERE id = :old.id;
END;
类似的更新和插入仅使用 :new
而不是 :old
和 null
在不在视图中的列中