2008-09-06 55 views
10

我一直听说有关触发器,我有几个问题。
什么是触发器?
我该如何设置它们?
除了典型的SQL内容之外,还有什么需要注意的地方吗?设置MySQL触发器

回答

15

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

我无法对mysql进行具体评论。

注意事项:触发器可以非常诱人,当你第一次使用它们时,它们看起来像是各种问题的灵丹妙药。但是,他们会发生“魔术”的事情,如果你不知道数据库里面的事情,看起来真的很奇怪(例如插入其他表格,输入数据改变等)。在实现事件作为触发器之前,我会认真考虑在模式周围强制使用API​​(最好在数据库中,但在外部如果不行)。

有些事情我还是使用触发器的

  • “DATE_CREATED”和“date_last_edited”领域
  • 保持跟踪插入“ID”的(在Oracle中,那里没有汽车id字段)
  • 饲养改变历史

事情你不想使用触发器,

  • 业务规则/逻辑
  • 任何它连接的数据库之外(例如Web服务调用)
  • 访问控制
  • 任何这不是事务性的(什么,你在做触发必须能够与回滚交易)
0

触发器是一个指定的数据库对象,它与一个表关联,并在表发生特定事件时被激活。

创建触发器:

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


即使我回答了这个部分的另一个问题仍然有效。

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

0

这个问题是旧的,其他的答案都非常好,但由于用户被问及应采取预防措施,我想补充一点:

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