触发器(Trigger)是针对某个表或视图所编写的特殊存储过程,它不能被显式地调用,
而是当该表或视图中的数据发生添加INSERT、更新UPDATE或删除DELETE等事件时自动被执行。
主要作用是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,
它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。
触发器的主要作用主要有以下接个方面:
强制数据库间的引用完整性;
级联修改数据库中所有相关的表,自动触发其它与之相关的操作;
跟踪变化,撤销或回滚违法操作,防止非法修改数据;
返回自定义的错误消息,约束无法返回信息,而触发器可以;
触发器可以调用更多的存储过程;
如果用户要通过数据操作语言 (DML) 事件编辑数据,则执行 DML 触发器。
DML 事件是针对表或视图的 INSERT、UPDATE 或 DELETE 语句。
在激发任何有效的事件时,将会激发这些触发器,而无论是否会影响任何表行。
当数据库服务器中发生数据操作语言事件时执行这些操作。
SqlServer中的DML触发器有三种:
insert触发器:向表中插入数据时被触发;
delete触发器:从表中删除数据时被触发;
update触发器:修改表中数据时被触发。
当遇到下列情形时,应考虑使用DML触发器:
1. 通过数据库中的相关表实现级联更改
2. 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
3. 评估数据修改前后表的状态,并根据该差异才去措施。
DDL触发器
DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,
使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
登录触发器将为响应 LOGIN 事件而激发存储过程。
与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。
因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。
如果身份验证失败,将不激发登录触发器。
在执行 INSERT、UPDATE、MERGE 或 DELETE 语句的操作之后执行 AFTER 触发器。
如果违反了约束,则永远不会执行 AFTER 触发器;因此,这些触发器不能用于任何可能防止违反约束的处理。
对于在 MERGE 语句中指定的每个 INSERT、UPDATE 或 DELETE 操作,将为每个 DML 操作触发相应的触发器。
INSTEAD OF触发器替代下列触发语句的标准操作。
因此,触发器可用于对一个或多个列执行错误或值检查,然后在插入、更新或删除行之前执行其他操作。
INSTEAD OF触发器的主要优点是可以使不能更新的视图支持更新。
INSTEAD OF触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。
--创建一个触发器
--检测到表数据有update时,更新CreateTime时间为当前时间
create trigger trigger_a_Students --触发器名称
on a_Students for update
begin
update a_Students SET CreateTime=GETDATE() --触发器需要执行的sql
--测试
--执行一个修改语句
update a_Students
set Name='孙悟空1'
where Number=100001
--查看数据
select * from a_Students
删除触发器
--删除触发器
drop trigger trigger_a_Students --触发器名称
查询触发器
--查看所有触发器
select * from sysobjects where xtype='TR'
-- 查看单个触发器
exec sp_helptext 'trigger_a_Students' --触发器名称
修改触发器
--修改一个触发器
--检测到表数据有update,insert时,更新CreateTime时间为当前时间
alter trigger trigger_a_Students --触发器名称
on a_Students for update,insert
begin
update a_Students SET CreateTime=GETDATE() --触发器需要执行的sql
--测试
--执行一个插入语句
INSERT INTO a_Students(Number,Name,ClassId)
VALUES('100016','李靖',3)
--查看数据
select * from a_Students
好了,我们就介绍到这里吧,
拜拜,我们下次不见不散。