2017-09-04 3 views
-1
나는 dB 여기

ORA-04098 : 트리거가 잘못하고 재 검증

에서 일부 데이터를 삽입하려고 내가 트리거에 문제가있어

데이터가 내가

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

': NEW.idLogin = qntdRows' 다음에 세미콜론이 누락되었습니다. 트리거 생성을 실행 한 직후,'show errors'를 실행하여 트리거가 정상적으로 컴파일되었는지 여부를 확인하십시오. 팁 :'CREATE TRIGGER ... '대신'CREATE OR REPLACE TRIGGER ...'명령을 사용하십시오. 또 하나 :'qntdRows DATATYPE' 다음에 세미콜론이 누락되었습니다. – krokodilko

+1

게다가,이 더 나은'qntdRows : = login_seq.nextval;'을 사용하여 "dual"과 함께 사용하십시오 –

+0

또한 어쨌든'DATATYPE'은 어떤 데이터 타입입니까? – APC

답변

0

당신은 세미콜론의 커플 번호해야 변수 당신의 선언을 누락되었습니다.

는 올바른 코드는 아래를 참조하시기 바랍니다 :

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

나는 그것이 간단하고 우아한 :

테드 찾을 수 있습니다.

+0

보내 주신 두 개의 트리거를 사용하려고했지만 표에 삽입하려고 할 때 여전히 오류가 발생합니다. –

+0

ORA-00001 : 고유 제한 조건을 위반하지 않았습니까? –

0

나는 ExDev 두 번째 솔루션과 그 기능을 잘 테스트했다.

동시에 트리거되는 오류 상태의 다른 트리거를 만들었 기 때문에 아마 작동하지 않았습니다. 삽입하려고하면 실행되고 오류로 인해 오류가 발생합니다.

해결 방법 : 과거에 생성 된 다른 트리거를 오류 상태로 시도하여 삭제했는지 확인하십시오. 그 후에 ExDev에서 제안한 솔루션을 시도하십시오.