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

Sql ORA-04098:触发器无效,重新验证失败,sql,oracle,sqlplus,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 VARC

我的触发器有问题我试图在数据库中插入一些数据

这是我试图插入的数据

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;

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

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


Ted.

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

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


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

之后缺少分号:NEW.idLogin=qntdRows
。在运行CREATETRIGGER语句之后,只需运行
showererrors
,检查触发器是否编译良好。提示:使用
CREATE或REPLACE TRIGGER…
命令代替
CREATE TRIGGER…
。另一个:在
qntdRows数据类型之后缺少分号
与“dual”一起使用时,还有什么数据类型是
数据类型
?我尝试使用您发送的这两个触发器,但在尝试插入到表中时仍有错误。您确定没有违反ORA-00001:唯一约束吗?