我正在攻读DBMS考试,我试图做一些触发器。 “标准”行触发器没有问题,但问题出现了语句触发器。
练习是创建一个触发器,如果某个列的值的总和更新到最小值(30)以下,则会引发异常。
所以表格如下:
ID | VALUE
----------
1 | 23
2 | 11
3 | 14
并且更新将执行类似
的操作UPDATE TABLE SET VALUE = VALUE - 10
这应该抛出异常,因为之前的总和是48,而更新之后的总和是18。
我尝试过使用行触发器但是在同一个表上执行select会产生一个“变异表”警告,所以我发现这应该是由于触发器设计不佳所致。
可能我应该实现一个语句触发器,但似乎我无法访问new_table或old_table,我不知道如何编写它们。这很蹩脚,因为它们似乎很简单,但我找不到任何有用的或任何例子。
任何帮助?
提前致谢!
编辑:
以及new_table / old_table引用似乎存在于Oracle ..
中答案 0 :(得分:2)
尝试这样的事情:
CREATE OR REPLACE TRIGGER trg_xyz
AFTER UPDATE ON tableX
DECLARE
v_sum number;
BEGIN
SELECT SUM(VALUE) into v_sum
FROM tableX;
IF v_sum < 30 THEN
raise_application_error(-20001,"ERROR MESSAGE");
END IF;
END;
/
答案 1 :(得分:0)
我不知道Oracle语法,但我相信new_table
与SQL Server中的INSERTED
相同;如果是这样的话:
CREATE TRIGGER TableName_U
BEFORE UPDATE
IF (SELECT SUM(VALUE) FROM new_table) < 30 THEN
BEGIN
raise error syntax
abort update syntax
END