2016-02-27 47 views
0

我必須編寫一個觸發器,它將在添加消息條目後更新消息條目,如果添加的消息文本長度爲20個字或更長,則更新消息條目。我一直在得到ORA-06512和ORA-04088錯誤,這顯然是當你有一個INSERT激活的觸發器,並且你的觸發器導致另一個INSERT,從而造成一個無限循環。如何解決我的SQL觸發器中的循環?

但我在我的觸發器中有一個UPDATE,它應該是由INSERT觸發的。我似乎無法找到我的代碼邏輯中的缺陷。有沒有另外寫這個?

CREATE OR REPLACE TRIGGER Length 
    AFTER INSERT ON Messages 
    FOR EACH ROW 
    WHEN (length(new.msg_text) - length(replace(new.msg_text, ' ', '')) >= 20) 
    BEGIN 
     UPDATE Messages 
     set Messages.length = 1 
     WHERE Messages.msgID = :new.msgID; 
    END; 
/

回答

0

做這個前插入:

CREATE OR REPLACE TRIGGER Length 
    BEFORE INSERT ON Messages 
    FOR EACH ROW 
    WHEN (length(:new.msg_text) - length(replace(:new.msg_text, ' ', '')) >= 20) 
    BEGIN 
     :new.length := 1 
    END; 
+0

我得到一個編譯錯誤,當創建觸發器並在此之後,當觸發器被觸發ORA-04098:觸發器「XXXX.LENGTH」是無效的,失敗的重新驗證 – Kaska

+0

是的,有一個名稱表。有沒有其他方法可以嘗試? – Kaska

+0

消息是否有一個名爲'length'的列?你的問題當然表明它的確如此。 - Gordon Linoff –