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

有帮助吗?

解决方案

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

我无法具体评论mysql。

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

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

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

您不想使用触发器的事情

  • 业务规则/逻辑
  • 连接数据库外部的任何内容(例如 Web 服务调用)
  • 访问控制
  • 任何非事务性的操作(您在触发器中执行的任何操作都必须能够随事务回滚)

其他提示

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;

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

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

要创建触发器:

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


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

这个问题很老了,其他答案都很好,但是由于用户询问了应该采取的预防措施,我想添加一些内容:

  • 如果您在复杂的环境中使用复制,请不要大量使用触发器,也不要从触发器中调用存储过程。
  • MySQL 中的触发器很慢。
  • 您不能在触发器内使用某些 SQL 语句。有些语句是允许的,但应该避免,例如 LOCK。一般规则是:如果你没有完全理解你正在做的事情的含义,你就不应该这样做。
  • 触发器可能会导致无限循环,所以要小心。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top