通俗易懂SQL server 中的触发器
一:什么是触发器?
触发器就是类似 陷阱触发机关一样,设置好陷阱,踩到陷阱触发机关。数据库触发器一样的道理,设置好一个东西,规定情况下触发生效。
官方:通过事件满足后自动实现的一种特殊存储过程
二:触发器种类?
触发器有俩种 ddl和dml 数据定义语言(data definition language) 数据操作语言(Data Manipulation Language)
dml数据操作语言 很容易理解 就是增删改数据的 时候 就是dml 可以理解为对表操作的触发器
ddl就是主要与以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句对应 理解为对库操作的触发器
三:相关的语句?
因为 常用触发器就是为了增删改操作 所以相关语句 以dml 触发器为例
1:创建语句 (通俗易懂 建一个触发器 名字是啥 在哪个表 什么操作后 触发 触发要做的啥事情)
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
注意:触发器名字不要带引号 [WITH ENCRYPTION]:表示将该触发器加密,加密后触发器执行方法将无法被查看 一般是不写
触发类别: after for 和 instead of 俩种 分别在表操作之前与表操作之后进行触发
触发条件:DELETE, INSERT, UPDATE
触发结果内容:
插入表(insered) | 删除表(deleted) | |
插入操作(insert) | 插入表中存放更新后的记录 | 无 |
修改操作(update) | 插入表中存放更新后的记录 | 删除表中存放更新前的记录 |
删除操作(delete) | 无 | 删除表中存放被删除的旧纪录 |
之后t-sql语句中如果要使用触发的结果内容 就需要使用 insered deleted
举例: 往bus表中添加数据时触发 从添加内容中查看价格 大于100的时候 往faq表加数据 小于100数据回滚
CREATE trigger [dbo].[test1]
on [dbo].[TourOrder_Bus]
after insert
as
begin
declare @a decimal
select @a=Price from inserted
if(@a>100)
begin
insert into faq values('asdasd','asda',1,123)
end
else
begin
print('价格不能小于100')
rollback transaction --数据回滚
end
end
不满足提示
满足就会触发内容 往faq表中添加一条记录
四:使用情景?
1:查看当前库中有哪些触发器
select * from sysobjects where xtype='TR'
2:查看某个触发器内容
exec sp_helptext 'test1'
3:多个关于触发器的情况 可看这篇文章不错
http://www.cftea.com/c/765.asp
触发器优点:
1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。
2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
3.级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
4.嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。
触发器缺点:
1. 可移植性差。
2.占用服务器资源,给服务器造成压力。
3.执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
4.嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。
触发器使用建议:
1.尽量避免在触发器中执行耗时操作,因为触发器会与SQL语句认为在同一事务中,事务不结束,就无法释放锁。
2.避免在触发器中做复杂操作,影响触发器性能的因素比较多(Eg:产品版本,所使用的架构等),要想编写高效的触发器考虑因素比较多,编写高性能触发器还是很难的。
3.触发器编写时注意多行触发时的处理。(一般不建议使用游标)