2024年10月sql语句触发器(SQL触发器语句)

 更新时间:2024-10-10 16:58:43

  ⑴sql语句触发器(SQL触发器语句

  ⑵呵呵,看到你的这个问题了,回答一下,希望能给你增加印象。由于SqlServer没有oracle中的行级触发器的概念,触发器如下:createtriggeronforinsert,updateasif(selectsalaryfrominserted)《updateteachersetsalary=andtid=(selecttidfrominserted)说明:当你插入数据的时候,这条数据是存放在【inserted】表中的,在这个表中把【teacher】表的主键得到(假如是【tid】然后把这个主键信息加到where条件上,这样就能起到只更新插入的那一条数据的效果了,否则会出现更新了全表的问题。---以上,希望对你有所帮助。

  ⑶SQL中触发器有什么作用

  ⑷触发器(trigger是SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS数据字典中查到。SQL的触发器是一个能由系统自动执行对数据库修改的语句。xdxa触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。xdxa触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。xdxa触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。xdxaSQLServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。xdxa语法为:xdxaCREATETRIGGER``.``xdxa《//dbo代表该表的所有者xdxaFOREACHROWxdxaBEGINxdxa--dosomethingxdxaENDxdxa触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与CHECK约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE或DELETE允许采取多个不同的对策以响应同一个修改语句。xdxa约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用Transact-SQL代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是PRIMARYKEY和UNIQUE约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过CHECK约束进行强制,而引用完整性(RI)则应通过FOREIGNKEY约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。xdxaCHECK约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益自定义信息和较为复杂的错误处理,则必须使用触发器。xdxa触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在titleauthor.title_id上创建一个插入触发器,使它在新值与titles.title_id中的某个值不匹配时回滚一个插入。不过,通常使用FOREIGNKEY来达到这个目的。xdxa如果触发器表上存在约束,则在INSTEADOF触发器执行后但在AFTER触发器执行前检查这些约束。如果约束破坏,则回滚INSTEADOF触发器操作并且不执行AFTER触发器。xdxa实例:insert触发器xdxacreatetriggertri_insertxdxaonstudentxdxaforinsertxdxaasxdxadeclarestudent_idchar()xdxaselectstudent_id=s.student_idfromxdxastudentsinnerjoininsertedixdxaons.student_id=i.student_idxdxaifstudent_id=’’xdxabeginxdxaraiserror(’不能插入的学号!’,,)xdxarollbacktranxdxaendxdxagoxdxa实例:update触发器xdxacreatetriggertri_updatexdxaonstudentxdxaforupdatexdxaasxdxaifupdate(student_id)xdxabeginxdxaraiserror(’学号不能修改!’,,)xdxarollbacktranxdxaendxdxagoxdxa实例:delete触发器示xdxacreatetriggertri_deletexdxaonstudentxdxafordeletexdxaasxdxadeclarestudent_idvarchar()xdxaselectstudent_id=student_idfromdeletedxdxaifstudent_id=’admin’xdxabeginxdxaraiserror(’错误’,,)xdxarollbacktranxdxaend

  ⑸SQl中触发器怎样执行的

  ⑹创建触发器是特殊的存储过程,自动执行,一般不要有返回值。

  ⑺后触发器(AFTER,FOR先执行对应语句,后执行触发器中的语句。

  ⑻前触发器?并没有真正的执行触发语句(insert,update,delete,而是执行触发后的语句。

  ⑼行级触发器(FOREACHROW在SQLserver中不存在。

  ⑽CREATETRIGGERtrigger_name???--触发器名称

  ⑾ONtable_name?????????--触发的表

  ⑿FOR?--选择触发器类型

  ⒀AS???????????????--触发后要做的语句

  ⒁GO???????????????--结束标记

  ⒂触发器的SQL语句解释

  ⒃createtriggerforupdateasifupdate(罚款额)//如果修改罚款额beginrollbacktransactionraiserror(’在未交罚金前不能修改罚款金额’,,)//提示“在未交罚金前不能修改罚款金额”insertintomodify_logvalues(current_user,getdate())select*frommodify_log//在表modify_log中返回是谁修改的及修改时间end

  ⒄sql中的触发器与存储过程有什么相同点和不同点希望能专业点,谢谢

  ⒅ANSI(美国国家标准化组织兼容的SQL命令(如Select,Update….)

  ⒆般流程控制命令(if…else…、while….)

  ⒇强化约束(Enforce

  ⒈restriction)

  ⒉跟踪变化Auditing

  ⒊级联运行(Cascaded

  ⒋operation)

  ⒌存储过程:在大型数据库系统中,一组为了完成特定功能的SQL语句集。

  ⒍触发器:SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法。

  ⒎存储过程:局时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

  ⒏触发器:可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。

  ⒐触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作之后立即被激活。

  ⒑触发器可以通过数据库中的相关表进行层叠更改。例如,可以在titles表的title_id列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用title_id列作为唯一键,在titleauthor、sales及roysched表中对各匹配行进行定位。

  ⒒触发器可以强制限制,这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其它表中的列。

  ⒓触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与CHECK约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

  ⒔触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

  ⒕SQL中,触发器是什么

  ⒖基本概念xdxa触发器是特殊的存储过程,基于一个表创建,主要作用就是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。xdxa当触发器所保护的数据发生变化(update,insert,delete后,自动运行以保证数据的完整性和正确性。通俗的说:通过一个动作(update,insert,delete调用一个存储过程(触发器。xdxa.类型xdxa()DML触发器xdxa在数据库中发生数据操作语言(DML事件时将启用。DML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句或DELETE语句。DML触发器可以查询其他表,还可以包含复杂的T-SQL语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足,则整个事务即自动回滚。xdxa()DDL触发器xdxaSQLServer的新增功能。当服务器或数据库中发生数据定义语言(DDL事件时将调用这些触发器。但与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发,相反,它们会为响应多种数据定义语言(DDL语句而激发。这些语句主要是以CREATE、ALTER和DROP开头的语句。DDL触发器可用于管理任务,例如审核和控制数据库操作。xdxa创建DML触发器xdxa.使用存储过程模板创建存储过程xdxa在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击要创建触发器的“表”,选择“新建触发器”命令,如图所示:xdxa在右侧查询器中出现触发器设计模板,用户可以在此基础上触发器,单击“执行”按钮,即可创建该触发器。xdxaxdxa.使用T-SQL语句创建表xdxaCREATETRIGGER触发器xdxaON表名xdxaFORxdxaASSQL语句xdxa例-:创建基于表reader,DELETE操作的触发器。xdxaUSELibraryxdxaGOxdxaIFEXISTS(SELECTnameFROMsysobjectsxdxaWHEREname=’reader_d’ANDtype=’TR’)xdxaDROPTRIGGERreader_d--如果已经存在触发器reader_d则删除xdxaGOxdxaCREATETRIGGERreader_d--创建触发器xdxaONreader--基于表xdxaFORDELETE--删除事件xdxaASxdxaPRINT’数据被删除!’--执行显示输出xdxaGOxdxa试试吧!xdxa应用:xdxaUSELibraryxdxaGOxdxaDELETEreaderxdxawhereRname=’aaa’xdxa执行结果:xdxa数据被删除!xdxa(所影响的行数为行xdxa例-:在表borrow中添加借阅信息记录时,得到该书的应还日期。xdxa说明:在表borrow中增加一个应还日期SReturnDate。xdxaUSELibraryxdxaIFEXISTS(SELECTnameFROMsysobjectsxdxaWHEREname=’T_return_date’ANDtype=’TR’)xdxaDROPTRIGGERT_return_datexdxaGOxdxaCREATETRIGGERT_return_date--创建触发器xdxaONBorrow--基于表borrowxdxaAfterINSERT--插入操作xdxaASxdxa--查询插入记录INSERTED中读者的类型xdxaDECLAREtypeint,dzbhchar(),tsbhchar()xdxaSETdzbh=(SELECTRIDFROMinserted)xdxaSETtsbh=(SELECTBIDFROMinserted)xdxaSELECTtype=TypeIDxdxaFROMreaderxdxaWHERERID=(SELECTRIDFROMinserted)--副本xdxa/*把Borrow表中的应还日期改为xdxa当前日期加上各类读者的借阅期限*/xdxaUPDATEBorrowSETSReturnDate=getdate()+xdxaCASExdxaWHENtype=THENxdxaWHENtype=THENxdxaWHENtype=THENxdxaENDxdxaWHERERID=dzbhandBID=tsbhxdxa应用:xdxaUSELibraryxdxaINSERTINTOborrow(RID,BID)values(’’,’TP-’)xdxa查看记录:xdxaxdxa例-:在数据库Library中,当读者还书时,实际上要修改表brorrowinf中相应记录还期列的值,请计算出是否过期。xdxaUSELibraryxdxaIFEXISTS(SELECTnameFROMsysobjectsxdxaWHEREname=’T_fine_js’ANDtype=’TR’)xdxaDROPTRIGGERT_fine_jsxdxaGOxdxaCREATETRIGGERT_fine_jsxdxaONborrowxdxaAfterUPDATExdxaASxdxaDECLAREdaysint,dzbhchar(),tsbhchar()xdxaSETdzbh=(selectRIDfrominserted)xdxaSETtsbh=(selectBIDfrominserted)xdxaSELECTdays=DATEDIFF(day,ReturnDate,SReturnDate)xdxa--DATEDIFF函数返回两个日期之差,单位为DAYxdxaFROMborrowxdxaWHERERID=dzbhandBID=tsbhxdxaIFdays》xdxaPRINT’没有过期!’xdxaELSExdxaPRINT’过期’+convert(char(),days)+’天’xdxaGOxdxa应用:xdxaUSELibraryxdxaUPDATEborrowSETReturnDate=’--’xdxaWHERERID=’’andBID=’TP-’xdxaGOxdxa执行结果:xdxa过期-天xdxa(行受影响)xdxa例-:对Library库中Reader表的DELETE操作定义触发器。xdxaUSELibraryxdxaGOxdxaIFEXISTS(SELECTnameFROMsysobjectsxdxaWHEREname=’reader_d’ANDtype=’TR’)xdxaDROPTRIGGERreader_dxdxaGOxdxaCREATETRIGGERreader_dxdxaONReaderxdxaFORDELETExdxaASxdxaDECLAREdata_yjintxdxaSELECTdata_yj=LendnumxdxaFROMdeletedxdxaIFdata_yj》xdxaBEGINxdxaPRINT’该读者不能删除!还有’+convert(char(),data_yj)+’本书没还。xdxaROLLBACKxdxaENDxdxaELSExdxaPRINT’该读者已被删除!’xdxaGOxdxa应用:xdxaUSELibraryxdxaGOxdxaDELETEReaderWHERERID=’’xdxa执行结果:xdxa该读者不能删除!还有本书没还。xdxa修改触发器xdxaALTERTRIGGER触发器xdxa删除触发器xdxaDROPTRIGGER触发器xdxa查看触发器xdxasp_helptexttrigger_namexdxasp_helptriggertable_name

  ⒗CREATETRIGGER创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft?SQLServer?允许为任何给定的INSERT、UPDATE或DELETE语句创建多个触发器。语法CREATETRIGGERtrigger_nameON{table|view}{{{FOR|AFTER|INSTEADOF}{}AS[{IFUPDATE(column)|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask){parison_operator}column_bitmask}]sql_statement}}参数trigger_name是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。Table|view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。WITHENCRYPTION加密sysments表中包含CREATETRIGGER语句文本的条目。使用WITHENCRYPTION可防止将触发器作为SQLServer复制的一部分发布。AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。不能在视图上定义AFTER触发器。INSTEADOF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEADOF触发器。然而,可以在每个具有INSTEADOF触发器的视图上定义视图。INSTEADOF触发器不能在WITHCHECKOPTION的可更新视图上定义。如果向指定了WITHCHECKOPTION选项的可更新视图添加INSTEADOF触发器,SQLServer将产生一个错误。用户必须用ALTERVIEW删除该选项后才能定义INSTEADOF触发器。{}是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。对于INSTEADOF触发器,不允许在具有ONDELETE级联操作引用关系的表上使用DELETE选项。同样,也不允许在具有ONUPDATE级联操作引用关系的表上使用UPDATE选项。WITHAPPEND指定应该添加现有类型的其它触发器。只有当兼容级别是或更低时,才需要使用该可选子句。如果兼容级别是或更高,则不必使用WITHAPPEND子句添加现有类型的其它触发器(这是兼容级别设置为或更高的CREATETRIGGER的默认行为。有关更多信息,请参见sp_dbcmptlevel。WITHAPPEND不能与INSTEADOF触发器一起使用,或者,如果显式声明AFTER触发器,也不能使用该子句。只有当出于向后兼容而指定FOR时(没有INSTEADOF或AFTER,才能使用WITHAPPEND。以后的版本将不支持WITHAPPEND和FOR(将被解释为AFTER。NOTFORREPLICATION表示当复制进程更改触发器所涉及的表时,不应执行该触发器。AS是触发器要执行的操作。sql_statement是触发器的条件和操作。触发器条件指定其它准则,以确定DELETE、INSERT或UPDATE语句是否导致执行触发器操作。当尝试DELETE、INSERT或UPDATE操作时,Transact-SQL语句中指定的触发器操作将生效。触发器可以包含任意数量和种类的Transact-SQL语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的Transact-SQL语句常常包含控制流语言。CREATETRIGGER语句中使用几个特殊的表:deleted和inserted是逻辑(概念表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表;这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted表中的所有值,请使用:SELECT*FROMdeleted如果兼容级别等于,那么在DELETE、INSERT或UPDATE触发器中,SQLServer将不允许引用inserted和deleted表中的text、ntext或image列。不能访问inserted和deleted表中的text、ntext和image值。若要在INSERT或UPDATE触发器中检索新值,请将inserted表与原始更新表联接。当兼容级别是或更低时,对inserted或deleted表中允许空值的text、ntext或image列,将返回空值;如果这些列不可为空,则返回零长度字符串。当兼容级别是或更高时,SQLServer允许在表或视图上通过INSTEADOF触发器更新text、ntext或image列。n是表示触发器中可以包含多条Transact-SQL语句的占位符。对于IFUPDATE(column)语句,可以通过重复UPDATE(column)子句包含多列。IFUPDATE(column)测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作。可以指定多列。因为在ON子句中指定了表名,所以在IFUPDATE子句中的列名前不要包含表名。若要测试在多个列上进行的INSERT或UPDATE操作,请在第一个操作后指定单独的UPDATE(column)子句。在INSERT操作中IFUPDATE将返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。说明IFUPDATE(column)子句的功能等同于IF、IF...ELSE或WHILE语句,并且可以使用BEGIN...END语句块。有关更多信息,请参见控制流语言。可以在触发器主体中的任意位置使用UPDATE(column)。column是要测试INSERT或UPDATE操作的列名。该列可以是SQLServer支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。IF(COLUMNS_UPDATED())测试是否插入或更新了提及的列,仅用于INSERT或UPDATE触发器中。COLUMNS_UPDATED返回varbinary位模式,表示插入或更新了表中的哪些列。COLUMNS_UPDATED函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含列以上,则COLUMNS_UPDATED返回多个字节,最左边的为最不重要的字节。在INSERT操作中COLUMNS_UPDATED将对所有列返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。可以在触发器主体中的任意位置使用COLUMNS_UPDATED。bitwise_operator是用于比较运算的位运算符。updated_bitmask是整型位掩码,表示实际更新或插入的列。例如,表t包含列C、C、C、C和C。假定表t上有UPDATE触发器,若要检查列C、C和C是否都有更新,指定值;若要检查是否只有列C有更新,指定值。parison_operator是比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(》)检查updated_bitmask中指定的任一列或某些列是否已更新。column_bitmask是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。注释触发器常常用于强制业务规则和数据完整性。SQLServer通过表创建语句(ALTERTABLE和CREATETABLE提供声明引用完整性(DRI);但是DRI不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则,请使用主键和外键约束(ALTERTABLE和CREATETABLE的PRIMARYKEY和FOREIGNKEY关键字。如果触发器表存在约束,则在INSTEADOF触发器执行之后和AFTER触发器执行之前检查这些约束。如果违反了约束,则回滚INSTEADOF触发器操作且不执行(激发AFTER触发器。可用sp_settriggerorder指定表上第一个和最后一个执行的AFTER触发器。在表上只能为每个INSERT、UPDATE和DELETE操作指定一个第一个执行和一个最后一个执行的AFTER触发器。如果同一表上还有其它AFTER触发器,则这些触发器将以随机顺序执行。如果ALTERTRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder重置排序值。只有当触发SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查成功执行后,AFTER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的UPDATE和DELETE引用级联操作的效果。

  ⒘SQLSERVER中触发器的触发类型有几种

  ⒙SQLSERVER中触发器的触发类型有三种。

  ⒚DML触发器,当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果对该表写了对应的DML触发器,那么该触发器自动执行。

  ⒛DDL触发器,是SqlServer新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改。

  登录触发器,登录触发器将为响应LOGIN事件而激发存储过程。与SQLServer实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。

  DML触发器的主要作用在于强制执行业务规则,以及扩展SqlServer约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。

  来自登录触发器内部且通常将到达用户的所有消息(例如错误消息和来自PRINT语句的消息会传送到SQLServer错误日志。如果身份验证失败,将不激发登录触发器。

  触发器可在写入数据表前,强制检验或转换数据。触发器发生错误时,异动的结果会被撤销。可依照特定的情况,替换异动的指令(INSTEADOF)。

  在SQL中,触发器是一种特殊类型的存储过程,它不同于SQL的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLServer就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:(强化约束(Enforcerestriction触发器能够实现比CHECK语句更为复杂的约束。(跟踪变化(Auditingchanges触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。(级联运行(Cascadedoperation。触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入而该操作又导致该表上触发器被触发。(存储过程的调用(Storedprocedureinvocation。为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统本身之外进行操作。由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、UPDATE、DELETE的多个触发器能够对同一种数据操作采取多种不同的处理。总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。触发器的种类SQLServer支持两种类型的触发器:AFTER触发器和INSTEADOF触发器。其中AFTER触发器即为SQLServer版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERTUPDATEDELETE之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。INSTEADOF触发器表示并不执行其所定义的操作(INSERT、UPDATE、DELETE,而仅是执行触发器本身。既可在表上定义INSTEADOF触发器,也可以在视图上定义INSTEADOF触发器,但对同一操作只能定义一个INSTEADOF触发器。

  SQL中的“触发器”是什么

  触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。xdxaxdxa触发器一般用在check约束更加复杂的约束上面。例如在执行update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。xdxaxdxaSQLServer中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。xdxaxdxaDML触发器分为:xdxa、after触发器(之后触发xdxaa、insert触发器xdxab、update触发器xdxac、delete触发器xdxa、insteadof触发器(之前触发xdxaxdxa其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而insteadof触发器表示并不执行其定义的操作(insert、update、delete而仅是执行触发器本身。既可以在表上定义insteadof触发器,也可以在视图上定义。xdxaxdxa触发器有两个特殊的表:插入表(instered表和删除表(deleted表。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。xdxaxdxaUpdate数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

您可能感兴趣的文章:

相关文章