2017-09-04 56 views
-1

我有一個觸發麻煩我嘗試在DBORA-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'後面缺少分號。運行create trigger語句之後,只需運行'show errors'來檢查觸發器編譯是否正確。提示:使用'CREATE OR REPLACE TRIGGER ...'命令而不是'CREATE TRIGGER ...'。另一個:在'qntdRows DATATYPE'後面缺少分號。 – krokodilko

+1

除此之外,使用這個更好的'qntdRows:= login_seq.nextval;'而不是使用「雙」 –

+0

而且,什麼樣的數據類型是'DATATYPE'? – APC

回答

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

我覺得它更簡單,更優雅:)

特德。

+0

我試過使用這兩個觸發器,但是當我嘗試插入表格時仍然出現錯誤。 –

+0

你確定你沒有得到ORA-00001:違反唯一約束嗎? –

0

我已經測試過ExDev的第二個解決方案及其作品。

它可能不適合你,因爲你創建了錯誤狀態的其他觸發器同時觸發。所以,當你試圖插入它們時,它們會被執行,並因爲它們而得到錯誤。

解決方案:檢查在過去的錯誤狀態嘗試中是否創建了其他觸發器並刪除它們。之後,嘗試使用ExDev建議的解決方案。