SQL Server中的触发器

本文介绍了数据库触发器的概念,包括其定义、类型及工作方式。触发器是在对表进行增删改操作时自动执行的存储过程,用于强制执行业务规则。文章详细解释了触发器如何通过inserted和deleted表来跟踪数据变化。

1.  什么是触发器

a)         触发器是在对表进行插入、更新或删除操作时自动执行的存储过程

b)        触发器通常用于强制业务规则

c)         触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束

                        i.              可执行复杂的SQL语句(if/while/case

                      ii.              可引用其它表中的列

d)        触发器定义在特定的表上,与表相关

e)         自动触发执行

f)         不能直接调用

g)        是一个事务(可回滚)

2.  触发器的类型

a)         DELETE 触发器

b)        INSERT 触发器

c)         UPDATE 触发器

3.  inserted deleted

a)         触发器触发时:

                        i.              系统自动在内存中创建deleted表或inserted

                      ii.              只读,不允许修改;触发器执行完成后,自动删除

b)        inserted

                        i.              临时保存了插入或更新后的记录行

                      ii.              可以从inserted表中检查插入的数据是否满足业务需求

                    iii.              如果不满足,则向用户报告错误消息,并回滚插入操作

c)         deleted

                        i.              临时保存了删除或更新前的记录行

                      ii.              可以从deleted表中检查被删除的数据是否满足业务需求

                    iii.              如果不满足,则向用户报告错误消息,并回滚插入操作

<think> 嗯,用户之前已经详细询问过触发器的作用,现在又明确要求我参考提供的引用资料来讲解SQL Server触发器的作用。看来用户对数据库的高级功能很感兴趣,可能是DBA或开发人员,需要深入理解触发器的实际应用场景。 从引用资料来看,几个关键点需要突出:首先引用[2][3]都强调了触发器是特殊的存储过程,由事件触发。这点要普通存储过程区分开。其次引用[1]提到的递归机制很特别,直接递归间接递归在实际开发中容易引发问题,需要重点说明。 用户可能特别关注实际应用场景,所以我要把引用[4]提到的跨数据库同步功能加进去。不过引用资料里优缺点说得比较散乱,得重新整理:自动执行高效维护是最大优点,但可移植性差、资源消耗大这点引用[2]提得很对。 技术细节上要注意三点:一是必须强调触发器在事务内执行的特征(引用[3]提到的回滚机制),二是级联操作比外键约束更灵活(如删除客户同时删订单),三是那个库存同步的例子很典型,值得展开。 用户上次问过"触发器存储过程的区别",这次回答要自然带出这个点。另外性能影响部分需要量化说明,比如高频写入不适合用触发器,这点引用[2]的注意事项很有价值。 最后生成的延伸问题要覆盖递归触发(基于引用[1])、同步实现(呼应引用[4])、适用场景(补充引用[2]的缺点部分)。这样既能解答当前问题,又为用户后续探索提供路径。 </think> 以下是SQL Server触发器核心作用的系统性总结,结合技术要点与实际应用场景: --- ### 一、核心作用 1. **强制数据完整性** - 实现复杂业务规则(如薪资下限检查)[^2] - 执行比`CHECK`约束更复杂的验证(如跨校验库存) ```sql CREATE TRIGGER CheckInventory ON OrderDetails AFTER INSERT AS IF EXISTS (SELECT * FROM inserted i JOIN Products p ON i.ProductID=p.ProductID WHERE i.Quantity > p.Stock) BEGIN RAISERROR('库存不足', 16, 1); ROLLBACK; END ``` 2. **自动化级联操作** - 删除客户时同步清除关联订单(替代外键级联删除)[^3] ```sql CREATE TRIGGER CascadeDeleteCustomer ON Customers INSTEAD OF DELETE AS BEGIN DELETE FROM Orders WHERE CustomerID IN (SELECT CustomerID FROM deleted) DELETE FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM deleted) END ``` 3. **实时数据同步** - 跨服务器同步数据(如SQL Server → MySQL)[^4] ```sql CREATE TRIGGER SyncToMySQL ON Products AFTER INSERT AS BEGIN EXEC sp_execute_external_script @language = N'Python', @script = N' import mysql.connector cnx = mysql.connector.connect(user=''user'', database=''test'') cursor = cnx.cursor() cursor.execute("INSERT INTO products VALUES (%s,%s)", (InputDataSet[0][0],InputDataSet[0][1])) cnx.commit()' END ``` 4. **变更审计追踪** - 自动记录关键数据修改历史[^3] ```sql CREATE TRIGGER AuditEmployee ON Employees AFTER UPDATE AS INSERT INTO AuditLog SELECT GETDATE(), USER_NAME(), 'UPDATE', d.EmployeeID, 'Salary', d.Salary, i.Salary FROM deleted d JOIN inserted i ON d.EmployeeID=i.EmployeeID WHERE d.Salary <> i.Salary ``` --- ### 二、技术特性对比 | **特性** | 触发器 | 应用层逻辑 | 存储过程 | |-------------------|-------------------------------|--------------------------|-----------------------| | **执行位置** | 数据库引擎内部 | 应用服务器 | 数据库引擎内部 | | **触发机制** | 事件驱动(INSERT/UPDATE/DELETE)| 显式调用 | 显式调用 | | **事务一致性** | 原生支持(自动回滚)[^3] | 需手动实现 | 需手动实现 | | **典型延迟** | <1ms | 10-100ms(含网络开销) | <5ms | --- ### 三、注意事项 1. **递归触发风险** - 直接递归:`A更新触发器A → 再次更新A` - 间接递归:`A更新触发器A → 更新B → 触发器B → 更新A`[^1] ```sql -- 关闭数据库递归触发 ALTER DATABASE MyDB SET RECURSIVE_TRIGGERS OFF ``` 2. **性能关键点** - 单次触发执行时间需控制在 **<10ms**(高频写入需慎用)[^2] - 避免在触发器中执行复杂查询或远程调用 3. **维护陷阱** - 嵌套触发器超过 **32层** 将强制终止[^1] - 触发器内禁用`SELECT *`,精确指定列减少锁争用 --- ### 四、适用场景决策树 ```mermaid graph TD A[需数据变更时自动执行?] -->|是| B{操作粒度} B -->|行级| C[触发器] B -->|语句级| D[存储过程] A -->|否| E[应用层实现] C --> F{是否跨服务器?} F -->|是| G[CLR触发器+外部脚本][^4] F -->|否| H[标准DML触发器] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值