SqlServer触发器理解
触发器的定义与分类: 只要触发器所在表上的对应时间发生,就会自动执行该触发器的代码.实际上,我们并不能直接调用触发器,唯一的方法是在分配哦触发器的表上执行某种行为方可激活触发器.??????[触发器是一种特殊的存储过程,他在执行特定的语言事件时生效 ? ???????SQL Server包括两大类触发器:DDL(数据定义语言)触发器和DML(数据操作语言)触发器 ? ? DDL触发器: ??????????????当服务器或数据库中发生数据定义语言(DDL)时,将调用这些触发器.DDL触发器是一种特殊的触发器,在影响数据定义语言语句时出发,可以用于在数据中执行管理任务,例如审核以及规范数据库中的操作. ????????????? 例如:Drop table,Create table 例1: ????? ????? create?trigger?tr_1 ??????on?database ??????for?Create_Table??--|| Drop_Table ??????as ??????? ?raiserror('你不能创建表',16,1) ????????????rollback??????--可以进行回滚因为Create_table?是隐式事务 ????????????????????? ????????????????????drop?trigger?tr_1?on?database?–-删除触发器时必须有on database指明是删除数据库上的触发器 ? ? DML触发器: ? ????? DML触发器细分为4种类型 ? ①一个表可以有多个后触发器,但只能有一个替代触发器??? 视图上只能有替代触发器不能有后触发器 ? AFTER 触发器(后触发) ??? 实例1: ? ????????if?exists(select?*?from?sysobjects?where?name='tr_3') ????????drop?trigger?tr_3 ????????Go ????????Create?trigger?tr_3 ????????on?Employee ????????for?update???–-当执行完了update语句后才会跳到我们后面定义的语句块 ??????????????as ????????????????if?update(CardID)????–-判断是否对某一列进行了更改 ????????????????????????raiserror('你不更改卡号ID',1) ????????实例2: ?????????if?exists(select?*?from?sysobjects?where?name='tr_4') ????????drop?trigger?tr_4 ????????Go ????????Create?trigger?tr_4 ????????on?Employee ????????for?delete ????????as ????????????raiserror('不能删除员工',1) ? ②所谓的后触发就是执行完了对应的操作才执行我们定义的触发器内的语句块 ? ? INSTEAD OF触发器 (替代触发) :????? ??????? 实例1: ??????? if?exists(select?*?from?sysobjects?where?name='tr_5') ????????drop?trigger?tr_5 ????????Go ????????Create?trigger?tr_5 ????????on?Employee ????????instead?of?delete?–替代了删除事件 ?????????as ???????????select?*?from?deleted??--看看临时deleted表里面有什么 ????????????????delete?from?pay?where?CardID?in?(select?CardID?from?deleted)??--先删子表再删基表 ? ?????????????????执行delete?from?Employee?where?CardID?in?(select?CardID?from?deleted) ? ? ? ③[所谓的替代触发就是不执行对应的操作而执行我们定义触发器内的语句块 ? ? 触发器使用的inserted临时表和deleted临时表:[无论是后触发还是替代触发都产生这2个临时表]: ? ????????????????????????????????? 虚拟表Inserted???????????????????????????? 虚拟表Deleted ? ? l.两个表的结构与激活触发器的原数据表结构相同。 ???????????? 比如我在表上制定了一个后触发器当插入了数据后往另外一个表也插入这条数据 ???????????? 当我执行insert的一条数据后 执行触发器的语句? 往另外一个表插入数据 ???????????? 问题来了 当我连续插入10条数据 触发器的运行机制又是怎样的呢? ? ???????????? SqlServer与MySql不同的点在于SqlServer在执行完10条插入Sql语句才允许触发器内的语句. ?????????????而MySql是行级触发? 也就是插入一条数据就执行触发器内的语句 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |