参考:http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html
https://blog.csdn.net/qq_36330228/article/details/90582493
Mysql触发器:https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/
SQL Server包括三种常规类型的触发器:DML触发器、DDL触发器、登录触发器。
1、DML(数据操作语言,Data Manipulation Language)触发器,附加在特定表或视图上,当数据库中发生数据操作事件时执行。
SqlServer中的DML触发器有三种:insert触发器:向表中插入数据时被触发;update触发器:修改表中数据时被触发;delete触发器:从表中删除数据时被触发。 instead of 触发器 (之前触发),替换原来的操作。
当遇到下列情形时,应考虑使用DML触发器:通过数据库中的相关表实现级联更改、防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
评估数据修改前后表的状态,并根据该差异才去措施。
2、DDL(数据定义语言,Data Definition Language)触发器,当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
3、登录触发器,将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。
因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
触发器主要使用的是DML,
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
语法:
create trigger tgr_name
on table_name
with encrypion –加密触发器
for [update/delete/insert]
as
T-SQL
go
create trigger tgr_name
on table_name
with encryption
instead of [update/delete/insert]
as
T-SQL
go
判断删除:if (object_id('tgr_message', 'TR') is not null) drop trigger tgr_message
修改:
alter trigger tgr_message
on student
after delete
as
raisError('tgr_message触发器被触发', 16, 10);
go
-- 禁用触发器
disable trigger tgr_message on student;
-- 启用触发器
enable trigger tgr_message on student;
--查询已存在的触发器
select * from sys.triggers;
select * from sys.objects where type = 'TR';
--查看触发器触发事件
select te.* from sys.trigger_events te join sys.triggers t
on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data';
--查看创建触发器语句
exec sp_helptext 'tgr_message';
触发器优点:
1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。
2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
3.级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
4.嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。
触发器缺点:
1. 可移植性差。
2.占用服务器资源,给服务器造成压力。
3.执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
4.嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。
触发器使用建议:
1.尽量避免在触发器中执行耗时操作,因为触发器会与SQL语句认为在同一事务中,事务不结束,就无法释放锁。
2.避免在触发器中做复杂操作,影响触发器性能的因素比较多(Eg:产品版本,所使用的架构等),要想编写高效的触发器考虑因素比较多,编写高性能触发器还是很难的。
3.触发器编写时注意多行触发时的处理。(一般不建议使用游标)