设置MySQL触发器

时间:2008-09-06 11:24:53

标签: mysql triggers

我听说过触发器,我有几个问题 什么是触发器?
如何设置它们?
除了典型的SQL内容之外,是否有任何预防措施应该采取?

4 个答案:

答案 0 :(得分:15)

触发器允许您在某些事件发生时执行数据库中的功能(例如,插入表中)。

我无法专门评论mysql。

预防措施:触发器非常诱人,当您第一次开始使用它们时,它们似乎是解决各种问题的灵丹妙药。但是,它们会让“神奇”的东西发生,如果你不知道数据库里面的东西,它看起来真的很奇怪(例如插入其他表,输入数据变化等)。在将事物作为触发器实现之前,我会认真考虑强制在模式周围使用API​​(最好是在数据库中,但如果不能,则在外面)。

我还会使用触发器

  • 跟踪“date_created”和“date_last_edited”字段
  • 插入“ID”(在oracle中,没有自动id字段)
  • 保持更改历史记录

你不想使用的东西触发

  • 业务规则/逻辑
  • 连接数据库外部的任何内容(例如网络服务电话)
  • 访问控制
  • 任何非事务性的东西(你在触发器中做的任何东西都必须能够用事务回滚)

答案 1 :(得分:1)

来自dev.mysql.com,触发器是

  

...一个命名的数据库对象   与表相关联,即   在特定事件时激活   对于桌子来说。

创建它们的语法is also documented at that site

简言之,

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

他们提供了一个例子:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

您至少需要遵守all the restrictions on stored functions。 您将无法锁定表,更改视图或修改触发触发器的表。同时触发may cause replication problems

答案 2 :(得分:0)

触发器是与表关联的命名数据库对象,在表发生特定事件时激活。
创建触发器:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;


即使我回答了这一部分,但另一个问题仍然存在。

答案 3 :(得分:0)

这个问题很老,其他答案都很好,但由于用户询问应该采取的预防措施,我想补充一点:

  • 如果在复杂环境中使用复制,请不要大量使用触发器,也不要从触发器调用存储过程。
  • MySQL中的触发器很慢。
  • 您不能在触发器中使用某些SQL语句。有些陈述是允许的,但应该避免,比如LOCK。一般规则是:如果你不完全理解你所做的事情的含义,你就不应该这样做。
  • 触发器可能会导致无限循环,所以要小心。