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

ORA-04098: trigger is invalid and failed re-validation

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

这是我要插入的数据

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

错误

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

table和序列

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;

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

我觉得它更简洁优雅:)

泰德

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

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

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