我一直在听说触发器,我有几个问题。
什么是触发器?
我该如何设置它们?
除了典型的 SQL 内容之外,是否还有其他应采取的预防措施?
Unkwntech
问问题
2054 次
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 回答