ORA-04098:触发器无效,重新验证失败

时间:2017-09-04 18:33:31

标签: sql oracle sqlplus

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

以下是我试图插入的数据

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

和Triger

  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;

2 个答案:

答案 0 :(得分:0)

你缺少几个分号,你变量的声明应该是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

我发现它更简单,更优雅:)

泰德。

答案 1 :(得分:0)

我已经测试了ExDev第二种解决方案,它运行良好。

它可能不适合您,因为您创建了同时触发的错误状态的其他触发器。因此,当您尝试插入时,它们会被执行,因此您会收到错误。

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