今天给大家讲讲触发器,触发器顾名思义就是当什么事件发生前或后才触发的一个东西~
一:触发器的优点
1.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
2.触发器可以通过数据库中的相关表进行层叠修改。
3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。
二:触发器的作用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面:
- 强制数据库间的引用完整性
- 级联修改数据库中所有相关的表,自动触发其它与之相关的操作
- 跟踪变化,撤销或回滚违法操作,防止非法修改数据
- 返回自定义的错误消息,约束无法返回信息,而触发器可以
- 触发器可以调用更多的存储过程
三:触发器的分类
SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
1.DML(数据操作语言,Data Manipulation Language)触发器
DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:
- insert触发器:向表中插入数据时被触发;
- delete触发器:从表中删除数据时被触发;
- update触发器:修改表中数据时被触发。
当遇到下列情形时,应考虑使用DML触发器:
- 通过数据库中的相关表实现级联更改
- 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
- 评估数据修改前后表的状态,并根据该差异才去措施。
2.DDL(数据定义语言,Data Definition Language)触发器
DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
3.登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
四:触发器的工作原理
触发器触发时:
- 系统自动在内存中创建deleted表或inserted表;
- 只读,不允许修改,触发器执行完成后,自动删除。
inserted表:
- 临时保存了插入或更新后的记录行;
- 可以从inserted表中检查插入的数据是否满足业务需求;
- 如果不满足,则向用户发送报告错误消息,并回滚插入操作。
deleted表:
- 临时保存了删除或更新前的记录行;
- 可以从deleted表中检查被删除的数据是否满足业务需求;
- 如果不满足,则向用户报告错误消息,并回滚插入操作。
inserted表和deleted表对照:
五:创建触发器
创建触发器的语法:
CREATETRIGGER trigger_name ON table_name [WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF[DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
--with encryption 表示加密触发器定义的sql文本
--delete,insert,update指定触发器的类型
准备测试数据:
--创建学生表
createtable student(
stu_id intidentity(1,1) primarykey,
stu_name varchar(10),
stu_gender char(2),
stu_age int)