如何在sql中创建一个Trigger

时间:2014-03-05 16:35:10

标签: mysql triggers

我一直试图创建一个Trigger,但是我的尝试都没有成功。我似乎得到了一个错误(#1064),我没有解决方案。有人可以解释或演示语法中的任何错误。

我指出:

我将delivery_id作为交付表中的主键, 我还在entry_log表中将delivery_id作为外键。 通过比较两个id(如果为真),将返回一个引用该位输出的文本(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 个答案:

答案 0 :(得分:1)

这假设您使用MySQL。在触发器的主体中使用

WHERE delivery.delivery_id = entry_log.delivery_id;

我想你想要与运行触发器的entry_log条目进行比较,对吗?在这种情况下,您必须使用以下语法:

WHERE delivery.delivery_id = NEW.delivery_id;

有关更多示例,请参阅here

<强>更新

我也看到你试图在TRIGGER中做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
//

请注意,这是我脑子里写的,所以要注意我脚本中的语法错误。