10

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

4

4 回答 4

15

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

我不能具体评论mysql。

预防措施:触发器可能非常诱人,当您第一次开始使用它们时,它们似乎是解决各种问题的灵丹妙药。但是,它们会发生“神奇”的事情,如果您不了解数据库,就会发生一些非常奇怪的事情(例如插入其他表、更改输入数据等)。在将事物实现为触发器之前,我会认真考虑强制在架构周围使用 API(最好在数据库中,但如果不能,则在外部)。

有些事情我仍然会使用触发器

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

您不想使用触发器的事情

  • 业务规则/逻辑
  • 任何连接到数据库之外的东西(例如网络服务调用)
  • 访问控制
  • 任何非事务性的(您在触发器中所做的任何事情都必须能够随事务回滚)
于 2008-09-06T11:35:21.883 回答
1

dev.mysql.com,触发器是

...与表相关联的命名数据库对象,当表发生特定事件时激活。

创建它们的语法也记录在该站点上

简要地,

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;

你至少需要遵守存储函数的所有限制。您将无法锁定表、更改视图或修改触发触发器的表。触发器也可能导致复制问题

于 2008-09-06T11:35:19.403 回答
0

触发器是与表相关联的命名数据库对象,当表发生特定事件时将激活该对象。

要创建触发器:

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


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

于 2008-09-06T11:34:10.250 回答
0

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

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