【问题标题】:ORA-04098: trigger is invalid and failed re-validationORA-04098: 触发器无效并且重新验证失败
【发布时间】:2017-09-04 18:33:30
【问题描述】:

我在使用触发器时遇到问题,我尝试在数据库中插入一些数据

这是我要插入的数据

INSERT INTO login (login, senha) VALUES ('admin', 'admin')

错误

ORA-04098: trigger 'HOTEL.bi_login' is invalid and failed re-validation

表格和序列

CREATE TABLE login(idLogin NUMBER(5), login VARCHAR2(50) UNIQUE, SENHA VARCHAR2(50), CONSTRAINT idLogin_pk PRIMARY KEY (idLogin));
CREATE sequence "login_seq";

还有触发器

  CREATE trigger "bi_login"
  before insert on login
  for each row
  DECLARE 
  qntdRows DATATYPE 
BEGIN 
  select "login_seq".nextval
  INTO qntdRows 
  FROM dual;
  :NEW.idLogin = qntdRows
END;

【问题讨论】:

  • :NEW.idLogin = qntdRows 后缺少分号。运行 create trigger 语句后,只需运行show errors 即可检查触发器是否编译正常。提示:使用CREATE OR REPLACE TRIGGER ... 命令代替CREATE TRIGGER ...。另一个:qntdRows DATATYPE 后面缺少分号。
  • 除此之外,为了更好地使用qntdRows := login_seq.nextval; 而不是与“双”一起使用
  • 另外,DATATYPE 到底是什么数据类型?

标签: sql oracle sqlplus


【解决方案1】:

你缺少几个分号,你的变量声明应该是 NUMBER。

请看下面正确的代码:

CREATE OR REPLACE trigger "bi_login"
  before insert on login
  for each row
DECLARE 
  qntdRows number;
BEGIN 
  select "login_seq".nextval
  INTO qntdRows 
  FROM dual;
  :NEW.idLogin := qntdRows;
END;

以上内容将替换您的无效触发器,并将编译没有任何错误!

此外,您可以使用以下替代代码实现相同的目的:

CREATE OR REPLACE trigger "bi_login"
  before insert on login
  for each row
BEGIN 
  :NEW.idLogin := "login_seq".nextval;
END;  

Successful Compilation Screenshot

我觉得它更简单更优雅:)

泰德。

【讨论】:

  • 我已经尝试使用您发送的这两个触发器,但是当我尝试插入表格时仍然出现错误。
  • 你确定你没有得到 ORA-00001: 违反唯一约束吗?
【解决方案2】:

我已经测试了 ExDev 的第二种解决方案,并且效果很好。

它可能对您不起作用,因为您创建了其他同时触发的处于错误状态的触发器。因此,当您尝试插入它们时,它们会被执行,并且由于它们而导致错误。

解决方案:检查您在过去的尝试中创建的其他触发器是否处于错误状态并删除它们。之后尝试 ExDev 建议的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多