设置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服务调用)
- 访问控制
- 任何非事务性的事情(我们在触发器中所做的任何事情都必须能够回滚事务)