【问题标题】:SQL Trigger creating troubleSQL 触发器创建问题
【发布时间】:2012-11-12 17:21:44
【问题描述】:

我有电影行政桌

movieexec
与列

(name varchar2(20), address varchar2(20), cert# number(10), networth float)

我想创建一个计算平均净值的触发器,如果​​它超过一定数量,比如 400000,则应该无法进一步插入,并且应该显示错误消息。

我实现了以下代码:

CREATE OR REPLACE TRIGGER pronet
AFTER INSERT
ON movieexec
FOR EACH ROW
DECLARE netavg float;
BEGIN
  SELECT AVG(networth) INTO netavg FROM movieexec;
  IF(netavg>400000) THEN
     RAISE_APPLICATION_ERROR(-20000,'average limit reached, cannot insert');
  ENDIF;
END

但出现以下错误

ERROR at line 7: PLS-00103: Encountered the symbol ";" when expecting one of the following:
  if
5. DECLARE netavg float;
6. BEGIN
7. **SELECT AVG(networth) INTO netavg FROM movieexec;**
8. IF(netavg>400000) THEN
9. RAISE_APPLICATION_ERROR(-20000,'average limit reached, cannot insert');

请提供帮助。

【问题讨论】:

  • 错误中的行号是指PL/SQL 块,而不是整个触发器语句。所以这是它不喜欢的最后一个end,而不是select。那是因为上一行 endif; 格式不正确 - 缺少一个空格。
  • 触发器创建成功,但是当我插入movieexec时出现以下错误..... ORA-04091:表SYSTEM.MOVIEEXEC正在变异,触发器/函数可能看不到它。 ORA-06512:在“SYSTEM.PRONET”,第 4 行 ORA-04088:执行触发器“SYSTEM.PRONET”时出错 – Gautham 2 分钟前编辑

标签: sql oracle triggers database


【解决方案1】:

创建表为

CREATE TABLE movieexec
(
    name          VARCHAR2 (20),
    address   VARCHAR2 (20),
    cert_no   NUMBER (10),
    networth   FLOAT
);

并将触发器创建为

CREATE OR REPLACE TRIGGER pronet
    AFTER INSERT
    ON movieexec
    FOR EACH ROW
DECLARE
    netavg  FLOAT;
BEGIN
    SELECT  AVG (networth)
      INTO  netavg
      FROM  movieexec;

    IF (netavg > 400000)
    THEN
        raise_application_error (-20000,
                                         'average limit reached, cannot insert'
                                        );
    END IF;
END;
/

【讨论】:

  • 你是在SYSTEM用户下创建的吗?
  • 是的,我在用户 SYSTEM 下创建了它。 ORA-04091:表 SYSTEM.MOVIEEXEC 正在变异,触发器/函数可能看不到它
    ORA-06512:在“SYSTEM.PRONET”,第 4 行 ORA-04088:执行触发器“SYSTEM.PRONET”时出错
  • @Gautham 如果您在插入之前而不是在插入之后进行,您可以避免变异错误,但我怀疑这对您的事业没有帮助。请参阅this 以避免突变触发器问题。
  • @Gautham 永远不要在 SYS、SYSTEM 用户下创建您的对象。
【解决方案2】:

使用触发器没有安全的方法来做到这一点,因为总会有办法颠覆它。

在 Oracle EE 中,您可以在提交物化视图上创建快速刷新以存储聚合,并对其放置检查约束。

另外,切勿使用 SYS 或 SYSTEM 帐户来创建您自己的对象。

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多