一 、什么是触发器
触发器(trigger)是SQL server来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
二、触发器和存储过程的区别:
触发器与存储过程的区别是运行方式的不同,触发器在执行T-SQL语句时自动触发执行,而存储过程需要用户,应用程序或者触发器来显式地调用并执行。
三、触发器的优点和使用场景
1. 触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
2. 级联修改数据库中所有相关的表,自动触发其它与之相关的操作(删除角色,所有使用,该角色的用户设置为默认的低权限角色)
3. 触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不 同的是,触发器可以引用其他表中的列。
4. 返回自定义的错误消息。CHECK约束无法返回信息,而触发器可以
5. 触发器可以调用更多的存储过程
四、SQL Server触发器的基本概念
-
类型:
- DML触发器:在执行数据修改语言(DML)语句时触发,如INSERT、UPDATE、DELETE。
- DDL触发器:在执行数据定义语言(DDL)语句时触发,如CREATE、ALTER、DROP。
-
作用域:
- 服务器作用域触发器:在服务器级别上触发,适用于DDL触发器。
- 数据库作用域触发器:在数据库级别上触发,适用于DML触发器。
-
触发时机:
- AFTER触发器:在数据修改操作之后触发。
- INSTEAD OF触发器:在数据修改操作之前触发,通常用于视图。
- 语法:
CREATE TRIGGER TriggerName ON TableName AFTER|INSTEAD OF TriggerEvent AS BEGIN -- Trigger logic here END
五、示例
假设我们有一个Employees
表,我们想要在每次插入新员工记录时自动设置一个默认的部门ID:
CREATE TRIGGER SetDefaultDepartment
ON Employees
AFTER INSERT
AS
BEGIN
UPDATE Employees
SET DepartmentID = 1
WHERE EmployeeID IN (SELECT EmployeeID FROM inserted)
AND DepartmentID IS NULL;
END
在这个示例中,
SetDefaultDepartment
触发器会在向Employees
表插入新记录后执行,如果新记录的DepartmentID
为空,则将其设置为1。