【问题标题】:Statement trigger in Oracle?Oracle中的语句触发器?
【发布时间】:2013-02-09 22:53:04
【问题描述】:

我正在准备 DBMS 考试,我正在尝试做一些触发器。 “标准”行触发器没有问题,但问题来自语句触发器。

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

所以表格是这样的:

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

更新会做类似的事情

UPDATE TABLE SET VALUE = VALUE - 10

这应该会引发异常,因为之前的总和是 48,而更新之后的总和是 18。

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

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

有什么帮助吗?

提前致谢!

编辑:

Oracle.. 中似乎还存在 new_table/old_table 引用。

【问题讨论】:

  • 您的链接指向JavaDB 的手册(这是一个重新命名的 Apache Derby 数据库)。这与 Oracle DBMS 无关。真正的 Oracle DBMS 手册可以在这里找到:oracle.com/pls/db112/docindex
  • Ups,由于托管地址,我认为那是 Oracle。感谢您指出这一点!

标签: sql oracle triggers


【解决方案1】:

试试这样的:

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;
/

【讨论】:

  • 是的,我或多或少地尝试过类似的方法,但我认为没有引用部分。我明天早上去检查一下,然后告诉你!谢谢
  • 我更新了答案。语句触发器不支持引用子句。所以我把它写成AFTER UPDATE,所以也许新数据可以通过表上的正常选择来获取。试试看它是否有效。
【解决方案2】:

我不知道 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

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多