触发器(同游标一样比较难理解,特殊的存储过程) 触发器是一种存储过程,只不过是一种特殊类型的存储过程,它的特殊性就在于根据某种特殊的情况下触发的, 存储过程的执行需要手动调用,而触发器作为一个存储过程它的执行,不是我们调用的,而是我们进行某些操作之后来触发它的, 它的原理相似于其它语言的事件句柄, 可以调用存储过程 它的主要作用就是用于实现由主键或外部键所不能保证的,复杂的参照完整性或数据一致性。 触发器还有以下几个功能: 1.可响应数据库的更新,触发器的操作可以通过调用一个或多个存储过程甚至可以通过调用外部过程来完成相应操作。 2.还可以跟踪数据库内数据的变化,并判断变化是否符合数据库的要求,例如(对数据库的更新,对表的更新)触发器可以侦测数据库内的操作从而 禁止数据库内未经许可的更新和变化,使数据库的修改和更新操作更加的安全,数据库运行更加稳定。 3.可以强化数据条件的约束,触发器可以实现比Cheak语句更为复杂的条件约束,(因为它是一个存储过程)更适合大型数据库管理系统中用来约束数据的完整性 4.级联和并行运行,触发器可以侦测数据库内的操作,并自动的级联影响整个数据库的各项内容。 触发器的类型: 事后触发器,替代触发器, 事后触发器是在事件发生之后(insert、update、delete)才执行的,才会调用这些触发器,而这些触发器的先后执行顺序可用由系统存储过程来指定,而且只能指定一个和最后一个 调用的触发器而中间无论多少个触发器只是以随机顺序来执行的,事后触发器可以在同一个表的某一个操作指定多个触发器。也就是说插入一条记录可以同时调用多个触发器 1.事后触发器:即After触发器,!!!它只能应用在表上,!!!但可以针对表的同一操作定义多个触发器,(譬如说对表插入这个操作,可以定义多个触发器),执行完一个存储过程,再执行另外一个, 再执行下一个,在表上只能为每一个insert、update、delete、指定一个第一个执行的触发器和最后一个执行的触发器,假如创建了六个触发器,指定了第一个和第六个, 那么中间的这个四个触发器将以随机的顺序执行,无法手动指定。若创建了3个触发器,指定第一个和第六个,中间的只剩下一个,只能按照顺序执行。 2.替代触发器:即 Instead Of触发器,此触发器与事后触发器最大的不同是该触发器并不是预先执行某一操作(insert、update、delete、)它会先执行这些代码, 一旦发生它仅仅是会执行触发器这些代码,并不会先执行这些操作。触发器执行了,但表中的记录没有做任何更改。 两种类型触发的区别 事后触发器只能应用到表上,并且一个表的某一操作同时触发多个触发器,可以利用存储过程来指定哪一个触发器先执行,哪一个后执行。 而替代触发器不仅可以应用到表上,还可以应用到视图上,而主要的应用范围就是视图而且替代触发器不会先执行(insert、update、delete)这些操作,它仅仅会执行触发器本身的代码。 创建事后触发器(事后触发器先执行对表的操作:删除、更新、插入记录然后才会调用触发器) create trigger testTriggerA on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。 for insert as,对该表进行insert操作时会调用该触发器 begin print‘testTriggerA被调用‘ end 查找触发器 sp_helptext testTriggerA 调用触发器: !!!调用触发器实际上是不需要手动来做的,只需要在表中插入记录的时候,就会调用这个触发器。 \\利用insert into语句对网站职员表插入值,来引起触发器中的语句来触发触发器。 insert into 网站职员表 (职员编号,毕业院校,姓名,家庭住址,年龄,奖金,总收入,工资) values(800,‘沈阳大学‘,‘吴‘,‘辽宁‘,28,500,6500,6000) 在数据库中键入该条语句的时候会弹出一个错误提示:!!! 当 IDENTITY_INSERT 设置为 OFF 时不能为表 ‘网站职员表‘中的标识列插入显式值。 !!!以上错误提示为:不能向该网站职员插入该值,以下为解决方法: set IDENTITY_INSERT 网站职员表 on \\首先利用IDENTITY_INSERT语句对网站职员表开启 insert into 网站职员表 (职员编号,毕业院校,姓名,家庭住址,年龄,奖金,总收入,工资) values(800,‘沈阳大学‘,‘吴‘,‘辽宁‘,28,500,6500,6000) set IDENTITY_INSERT 网站职员表 off \\再利用IDENTITY_INSERT语句对网站职员表进行关闭 !!!!!每执行一次,触发器都会被调用一次 再创建两个触发器,都是在表中插入记录时调用这个触发器,使之每次插入记录时可以调用三个触发器! create trigger testTriggerB on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。 for insert as,对该表进行insert操作时会调用该触发器 begin print‘testTriggerA被调用‘ end create trigger testTriggerC on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。 for insert as,对该表进行insert操作时会调用该触发器 begin print‘testTriggerA被调用‘ end 上节课学习的是在一个表中的某一个操作(insert、update、delete),可以同时调用多个触发器 还可以在(调用、insert、update、delete)时调用触发器 更新的时候被调用 create trigger testUpdateTriggerA on 网站职员表 for update as \\创建触发器名字,并声明该触发器是为网站职员表创建的。 begin 对网站职员表进行update时候会调用该触发器。 print‘更新触发器被调用‘ end 删除的时候被调用 create trigger testDeleteTriggerA on 网站职员表 for delete as \\删除时触发器被调用 begin print‘testDeleteTriggerA触发器被调用‘ end 学习如何利用sp_settriggerorder这个系统存储过程来改变同时触发多个触发器时,触发器的先后调用顺序(指定第一个和最后一个调用的触发器) 再创建3个触发器 testTriggerA被调用 \\插入一条记录同时调用6个触发器 第二个触发器 第三个触发器被调用 testTriggerD触发器被调用。 testTriggerE触发器被调用。 testTriggerF触发器被调用。 指定触发器的调用先后顺序(只能指定第一个和最后一个) sp_settriggerorder @triggername=‘testTriggerA‘,@order=‘first‘, @stmttype=‘insert‘\\利用sp_settriggerorder对触发器的顺序进行修改。 \\触发器的名字testTriggerA \\触发器的顺序last \\触发器的类型insert sp_settriggerorder @triggername=‘testTriggerF‘,@order=‘last‘, @stmttype=‘insert‘\\利用sp_settriggerorder对触发器的顺序进行修改。 \\触发器的名字testTriggerF \\触发器的顺序last \\触发器的类型insert sp_settriggerorder是用于定义触发器执行先后顺序的一个系统存储过程 sp_settriggerorder @triggername=‘testTriggerF‘,@order=‘none‘, @stmttype=‘insert‘ \\取消触发器先后执行顺序的特性,只需将Oder改为none!!!! 创建替代触发器(用触发器中的代码来代替对表的某些操作) 创建 触发器 自定义触发器的名字 替代 删除 create Trigger testInsteadTriggerA on 网站职员表 instead of delete as \\对网站职员表进行删除操作时,并不真正执行删除操作 begin 而是执行触发器中的代码中(print‘替代触发器调用‘) print‘替代触发器调用‘ end 创建一个触发器,当向网站职员表中插入一条记录的时候,那么向网站经营项目表中就会同样插入一条记录 并且可以用指定的插入的员工他的姓名来指定负责一个项目 带有插入功能或者其它的特殊功能的触发器,最好用替代触发器 create trigger triggerTestInsertA on 网站职员表 for insert as \\每次向网站职员表中插入一条记录时都会调用这个触发器 begin insert into 网站经营项目B (项目编号,项目名称,负责人,合作单位) values (1,‘视频教程‘,‘小伟‘,‘独立开发‘) \\此触发器的作用就是 end 向网站经营项目B插入这样一条记录 update 网站职员表 set 姓名=‘小赵‘ where 姓名=‘小伟‘ \\把网站职员表中的小伟改成小赵 \\将姓名等于小伟的这个字段更新 利用T-SQL语句修改数据库 \\update alter trigger triggerTestInsertA on 网站职员表 for insert as \\修改该触发器,把更新时触发 begin 改成插入时触发 print‘triggerTestInsertA触发器被调用‘ end 利用T-SQL语句删除数据库 drop trigger triggerTestInsertA 利用两个存储过程: 1.一个用于查看触发器的基本信息 2.另一个查看触发器创建时所用的的代码 查看触发器的基本信息 exec sp_help triggerTestInsertA 查看触发器创建时所用的的代码 exec sp_helptext triggerTestInsertA
原文地址:https://www.cnblogs.com/LNCC-ZhangXiang/p/11077450.html
时间: 2024-10-04 20:02:49