2

我正在为 DBMS 考试而学习,我正在尝试做一些触发器。“标准”行触发器没有问题,但问题出现在语句触发器上。

练习是创建一个触发器,如果​​某个列的值的总和更新到低于最小值 (30),则引发异常。

所以表是这样的:

ID | VALUE
----------
 1 |  23
 2 |  11
 3 |  14

并且更新将执行类似的操作

UPDATE TABLE SET VALUE = VALUE - 10

这应该抛出一个异常,因为之前的总和是 48,更新之后的总和是 18。

我已经尝试过使用行触发器,但是在同一张表上进行选择会引发“变异表”警告,所以寻找这个我想这应该是由于触发器设计不佳造成的。

可能我应该实现一个语句触发器,但似乎我无法访问 new_table 或 old_table,而且我不知道如何编写它们。这很糟糕,因为它们看起来很简单,但我找不到任何有用的东西或任何例子。

有什么帮助吗?

提前致谢!

编辑:

并且新表/旧表引用似乎也存在于Oracle中。

4

2 回答 2

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;
/
于 2013-02-09T23:45:09.043 回答
0

我不知道 Oracle 语法,但我相信与 SQL Server 中new_table的语法相同INSERTED;如果是这样的话:

CREATE TRIGGER TableName_U
BEFORE UPDATE
IF (SELECT SUM(VALUE) FROM new_table) < 30 THEN
    BEGIN
        raise error syntax
        abort update syntax
    END
于 2013-02-09T23:17:22.580 回答