2014-03-05 55 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