概述触发器(trigger)是SQLserver为程序员和数据分析师提供的一种保证数据完整性的方法。它是与表事件相关的一个特殊的存储过程,它的执行不是由程序调用,也不是手动启动,而是由事件触发。当对一个表进行操作(插入、删除、更新)时,它会被激活执行。触发器通常用于强制执行数据完整性约束和业务规则。一、扳机的优点1、扳机是自动的。对表中的数据进行任何修改后立即激活。2、触发器可以通过数据库中的相关表进行级联。3.触发器可以强制执行限制。这些约束比使用CHECK约束定义的约束更复杂。与CHECK约束不同,触发器可以引用其他表中的列。二、触发器的分类SqlServer包括三种通用的触发器:DML触发器、DDL触发器和登录触发器。1、DML(DataManipulationLanguage,数据操纵语言)触发器DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器发生数据操纵语言事件时执行这些操作。SqlServer中的DML触发器分为三种:insert触发器:向表中插入数据时触发;delete触发器:表中数据被删除时触发;更新触发器:当表中的数据被修改时触发。在以下情况下应考虑DML触发器:通过数据库中的相关表实现级联更改防止恶意或错误的插入、更新和删除操作,并实施比检查约束定义的更复杂的其他约束。评估数据修改前后表的状态,并根据差异采取措施。2.DDL(DataDefinitionLanguage,数据定义语言)触发器当服务器或数据库中发生数据定义语言(主要是create、drop、alter开头的语句)事件时,DDL触发器被激活,使用DDL触发器是可以防止的对数据模式的某些更改或记录数据中的更改或事件操作。3.登录触发器登录触发器将触发存储过程以响应LOGIN事件。当与SQLServer实例建立用户会话时会引发此事件。登录触发器在登录的身份验证阶段完成后和用户会话实际建立之前触发。因此,来自触发器内通常会到达用户的所有消息(例如错误消息和来自PRINT语句的消息)都被路由到SQLServer错误日志。如果身份验证失败,则不会触发登录触发器。3.触发器[DELETE,INSERT,UPDATE]的工作原理对应的是当触发delete,insert,update三个动作执行insert时,可以获取inserted的数据,可以使用select*frominserted来读取并执行删除。要获取删除前的数据,可以使用select*fromdeleted来读取。执行update时,可以使用select*fromdeleted读取更新前的数据。要获取更新后的数据,可以使用select*frominserted来读取。四、创建触发器1、创建触发器的语法:CREATETRIGGERtrigger_nameONtable_name[WITHENCRYPTION]FOR|AFTER|INSTEADOF[DELETE,INSERT,UPDATE]AST-SQL语句GO--withencryption代表加密触发器定义的sql文本--delete,insert,update指定触发器的类型2.创建插入触发器--创建插入触发器createtriggertrig_insertonstudentafterinsertasbeginifobject_id(N'student_sum',N'U')isnull--判断student_sum表是否存在createtablestudent_sum(stuCountintdefault(0));---createastudent_sumtabledeclare存储学生人数@stuNumberint;select@stuNumber=count(*)fromstudent;ifnotexists(select*fromstudent_sum)--判断表中是否有记录insertintostudent_sumvalues(0);updatestudent_sumsetstuCount=@stuNumber;--将更新后的学生总数插入student_sum表中端--测试触发器trig_insert-->功能是向student中插入数据,插入student_sumtableincascade,andupdatestuCount--因为是后触发,triggertrig_insert;insertintostudent是在数据先插入(stu_name,stu_gender,stu_age)values('吕布','男',30);selectstuCounttotalnumberofstudentsfromstudent_sum;insertintostudent(stu_name,stu_gender,stu_age)values('貂蝉','female',30);selectstuCounttotalnumberofstudentsfromstudent_sum;insertintostudent(stu_name,stu_gender,stu_age)values('曹阿曼','男',40);从student_sum中选择stuCount学生总数;3、创建删除触发器当用户执行删除操作时,删除触发器会被激活,从而控制用户是否有能力从数据库中删除Delete数据记录。delete触发器触发后,用户删除的记录会被添加到deleted表中,原表中对应的记录也会被删除,所以在deleted表中查看被删除的记录——创建删除触发器createtriggertrig_deleteonstudentafterdeleteasbeginselectstu_idasdeletedstudentsNumber,stu_namestu_gender,stu_agefromdeletedend;--执行删除语句触发trig_deletetriggerdeletefromstudentwherestu_id=1;4.创建一个UPDATE触发器update触发器在用户对指定表执行update语句时被调用。这种类型的触发器用于限制用户修改数据。更新触发器可以执行两种操作:更新前的记录存储在删除表中,更新后的记录存储在插入表中。--创建更新触发器createtriggertrig_updateonstudentafterupdateasbegindeclare@stuCountint;select@stuCount=count(*)fromstudent;updatestudent_sumsetstuCount=@stuCount;selectstu_idas更新前的学号,stu_name为更新前的学号fromdeletedselectstu_idas更新后的学号,insertedendfrom创建后的学号,执行一个更新语句触发trig_updatetriggerupdatesstudentstu_name='张飞'wherestu_id=2;5.管理触发器1.查看触发器(1)。查看数据库中的所有触发器--查看数据库中的所有触发器使用数据库名goselect*fromsysobjectswherextype='TR'sysobjects保存数据库的对象,xtype为TR的记录为触发器对象。在名称列中,我们可以看到触发器名称。(2).sp_helptext查看触发器内容usedatabasenamegoexecsp_helptext'triggername'会以表格的形式显示触发器内容。除了触发器之外,sp_helptext还可以显示规则的文本、默认值、未加密的存储过程、用户定义的函数和视图。(3).sp_helptrigger用于查看触发器的属性。sp_helptrigger有两个参数:第一个参数是表名;其次是触发器类型,为char(6)类型,可以是INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。--查看数据库中的所有触发器usedatabasenamegoselect*fromsysobjectswhereextype='TR'usedatabasenamegoexecsp_helptriggertableName2.disableenabletriggerdisable:altertable表名disabletrigger触发器名enable:altertabletablenameenabletriggertrigger如果有多个触发器名,每个触发器名之间用逗号隔开。如果将“TriggerName”替换为“ALL”,则表示禁用或启用该表的所有触发器。3.修改触发器——修改触发器语法ALTERTRIGGERtrigger_nameONtable_name[WITHENCRYPTION]FOR{[DELETE][,][INSERT][,][UPDATE]}ASsql_statement;4、删除触发器--语法格式:DROPTRIGGER{trigger}[,...n]参数:trigger:要删除的触发器名称n:占位符,表示可以删除多个触发器
