本指南深入探讨了如何在Microsoft SQL Server中实现高效的数据管理和查询执行。通过详尽的技术细节和实用建议,帮助开发者解决性能瓶颈问题,提升数据库操作效率。
第三课:触发器
本课程将介绍在SQL Server 7.0中使用触发器的注意事项。
## 触发器概述
### 触发器的基本用法
#### 创建示例表和数据:
```sql
CREATE TABLE Orders (orderid int, orderdate datetime)
GO
INSERT INTO Orders VALUES(1,2005-3-4)
GO
```
#### 插入触发器:
```sql
CREATE TRIGGER trgOrdersInsert ON Orders
FOR INSERT AS
PRINT New Order Added
GO
-- 测试插入操作:
INSERT INTO Orders VALUES (2, 2016-7-8)
SELECT * FROM Orders
```
执行上述代码后,将看到触发器被激活并打印消息。
#### 更新和删除触发器:
```sql
CREATE TRIGGER trgOrdersUpdate ON Orders
FOR UPDATE AS
PRINT Order Updated
GO
-- 测试更新操作:
UPDATE Orders SET orderdate = 2016-7-8
SELECT * FROM Orders
```
执行上述代码后,将看到触发器被激活并打印消息。
#### 删除触发器:
```sql
DROP TRIGGER trgOrdersInsert ON Orders
GO
```
### 触发器的限制
- **事务边界**:触发器不能跨越多个事务。
- **递归调用**:默认情况下,SQL Server不支持直接或间接地在同一个表上的同一类操作中多次执行相同的触发器。可以通过设置 `sp_settriggerorder` 来改变这一行为。
### 多行操作的处理
当对包含多条记录的操作(如批量插入、更新)应用触发器时,必须确保代码能够正确应对这种情况。
```sql
CREATE TRIGGER trgOrdersInsert ON Orders
FOR INSERT AS
SELECT orderid, orderdate FROM inserted
GO
-- 测试批量插入:
INSERT INTO Orders VALUES (3,2016-7-8),(4,2016-7-9)
SELECT * FROM Orders
```
### 触发器的调试
使用 `DBCC INPUTBUFFER` 和 `DBCC PSS` 命令来查看触发器被调用时执行的具体语句和堆栈信息。
```sql
-- 查看引发触发器的操作:
DBCC inputbuffer(@@spid)
-- 获取当前正在运行的批处理中的所有过程或存储过程:
EXEC sp_pss @processID = @@SPID, @lineNumber = 0
```
### 触发器中错误信息的捕获
在触发器内部使用 `@@ERROR` 和 `RAISERROR` 来检查并报告错误。
```sql
CREATE TRIGGER trgOrdersInsert ON Orders
FOR INSERT AS
BEGIN TRY
IF EXISTS(SELECT * FROM inserted WHERE orderdate > 2016-7-8)
RAISERROR(Cannot insert orders with dates beyond July 8, 2016,16,1)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS Severity,
ERROR_STATE() AS State,
ERROR_PROCEDURE() AS ProcedureName,
ERROR_LINE() As LineNumber,
ERROR_MESSAGE() As ErrorMessage;
END CATCH
```
通过上述示例,可以了解如何在SQL Server中创建、测试和调试触发器。