设置MySQL触发器

时间:2020-03-05 18:48:40  来源:igfitidea点击:

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

解决方案

回答

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

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

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

回答

从dev.mysql.com,触发是

...a named database object that is
  associated with a table and that is
  activated when a particular event
  occurs for the table.

该站点还记录了创建它们的语法。

简要地,

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;

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

回答

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

我不能特别评论mysql。

注意事项:触发器可能非常诱人,当我们第一次开始使用它们时,它们似乎是解决各种问题的灵丹妙药。但是,它们使"神奇"的事情发生了,如果我们不知道数据库由内而外的话,那么看起来好像真的很奇怪(例如,向其他表中的插入,输入数据的更改等)。在将事情实现为触发器之前,我会认真考虑改为在架构周围强制使用API​​(最好在数据库中,但如果不能,则在外部)。

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

  • 跟踪" date_created"和" date_last_edited"字段
  • 插入" ID"(在oracle中没有自动ID字段中)
  • 保持变更历史

我们不想使用触发器的事情

  • 业务规则/逻辑
  • 连接数据库外部的任何内容(例如,Web服务调用)
  • 访问控制
  • 任何非事务性的事情(我们在触发器中所做的任何事情都必须能够回滚事务)