2014-03-05 95 views
0

我一直在嘗試創建一個觸發器,但是我的嘗試失敗了。我似乎得到一個錯誤(#1064),我無法解決。有人可以解釋或證明語法中的任何錯誤。如何在sql中創建觸發器

讓我指定:

我已經delivery_id在交付表, 我也delivery_id在entry_log表的外鍵的主鍵。 通過比較這兩個ID(如果爲true),會返回一個文本指的是位的輸出(0或1)

DELIMITER // 
    DROP TRIGGER IF EXISTS entry_trigger// 

    CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log 
    FOR EACH ROW 
    BEGIN 

    DECLARE @xentry VARCHAR(45) 
    DECLARE @inta bit 

    SET @inta = SELECT allowed 
    FROM delivery 
    WHERE delivery.delivery_id = entry_log.delivery_id; 


CASE 
    when @inta = 0 then @xentry = 'Acces Denied' 
    when @inta = 1 then @xentry = 'Acces Allowed' 
END CASE 

    INSERT INTO entry_log(entry_time,access_allowed) VALUES(now(),@xentry); 

END 
// 

回答

1

這是假設你使用MySQL。在你使用的觸發器的主體

WHERE delivery.delivery_id = entry_log.delivery_id; 

我想你想比較的entry_log條目觸發器正在運行,對嗎?在這種情況下,你必須使用此語法:

WHERE delivery.delivery_id = NEW.delivery_id; 

看到here更多的例子。

UPDATE

我看你也嘗試觸發器中做一個INSERT INTO entry_log。這當然不起作用,因爲你會創建一個無限遞歸循環。在觸發器的 正文中,您可以執行不相關的表訪問,但不能插入要插入的表中。您可以通過設置NEW.xyz = whatever

更新2

我懷疑,你CASE說法正確的是改變由觸發器插入的值。至少它必須以END CASE結尾。您可以在這裏使用IF,因爲您沒有太多需要解決的情況。如果必須使用CASE這篇文章可以幫助你:MYSQL Trigger set datetime value using case statement

更新3 我不知道,但我認爲你需要周圍的變量設置語句括號。試試這個觸發器的定義:

DELIMITER // 
DROP TRIGGER IF EXISTS entry_trigger// 

CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log 
FOR EACH ROW 
BEGIN 
    SET @inta = (SELECT allowed 
       FROM delivery 
       WHERE delivery.delivery_id = NEW.delivery_id); 

    SET NEW.access_allowed = @inta; 
    SET NEW.entry_time = NOW(); 
END 
// 

請注意,這是寫在我的頭上,所以要小心在我的腳本語法錯誤。

+0

這種CASE語句也是一個問題嗎?它不是一個IF語句,還是將CASE嵌入到後續的INSERT中? – MatBailie

+0

我不確定,我剛看到第一個問題。還有更多。我將在我的回答更新中解決此問題 – luksch

+0

我已將其更改爲END CASE:我仍然收到第5行的錯誤(#1064) – theone