您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > T-SQL触发器解析
触发器2本章目标了解为什么需要触发器理解触发器的工作原理掌握如何使用inserted表和deleted表掌握如何创建:INSERT触发器UPDATE触发器DELETE触发器3为什么需要触发器(TRIGGER)呢?典型的应用就是银行的取款机系统为什么需要触发器帐户信息表bank交易信息表transInfo张三取钱200问题:没有自动修改张三的余额解决方案之一:存储过程+事务解决方案之二:触发器它是一种特殊的存储过程也具备事务的功能它能在多表之间执行特殊的业务规则张三开户1000元,李四开户1元4张三李四王五赵二王三宋二刘五插入什么是触发器3-1删除触发器触发赵二退休赵二员工表退休员工表5触发器是在对表进行插入、更新或删除操作时自动执行的存储过程触发器通常用于强制业务规则触发器是一种高级约束,可以定义比用CHECK约束更为复杂的约束可执行复杂的SQL语句(if/while/case)可引用其它表中的列什么是触发器3-26触发器定义在特定的表上,与表相关自动触发执行不能直接调用是一个事务(可撤销)什么是触发器3-3触发器的类型:按SQL语言类型划分分为:DML触发器和DDL触发器。1、DML触发器。DML触发器是一种与表紧密关联的特殊的存储过程,当数据库中发生数据操作语言(DML)事件时将调用DML触发器。按触发时机分为:●AFTER触发器指定DML触发器仅在触发SQL语句中指定的所有操作都已成功执行时才被激发。●INSTEADOF触发器指定DML触发器用于“替代”引起触发器执行的T-SQL语句,因此其优先级高于触发语句的操作。8按触发事件划分DELETE触发器INSERT触发器UPDATE触发器当对某一表进行修改,诸如UPDATE,INSERT,DELETE这些操作时,SQLServer就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则DML触发器功能(1)级联修改数据库中相关的表。(2)防止恶意或错误insert\update\delete操作,实现比CHECK约束更为复杂的约束操作。(3)拒绝或撤销违反引用完整性约束的操作。(4)比较表修改前后数据之间的差别,并根据差别采取相应的操作。10触发器触发时:系统自动在内存中创建deleted表或inserted表只读,不允许修改;触发器执行完成后,自动删除inserted表临时保存了插入或更新后的记录行可以从inserted表中检查插入的数据是否满足业务需求如果不满足,则向用户报告错误消息,并撤销插入操作deleted表临时保存了删除或更新前的记录行可以从deleted表中检查被删除的数据是否满足业务需求如果不满足,则向用户报告错误消息,并撤销插入操作inserted和deleted表2-111inserted和deleted表2-2修改操作inserted表deleted表增加(INSERT)记录存放新增的记录------删除(DELETE)记录-----存放被删除的记录修改(UPDATE)记录存放更新后的记录存放更新前的记录inserted表和deleted表存放的信息12创建触发器的语法:如何创建触发器CREATETRIGGERtrigger_nameONtable_name[WITHENCRYPTION]FOR[DELETE,INSERT,UPDATE]AST-SQL语句GOWITHENCRYPTION表示加密触发器定义的SQL文本DELETE,INSERT,UPDATE指定触发器的类型13INSERT触发器transInfocardIDtransTypetransMoney1001000210010002存入300存入500insertedcardIDtransTypetransMoney10010001支取200transInfocardIDtransTypetransMoney1001000210010002存入300存入50010010001支取200插入记录行触发insert触发器。向inserted表中插入新行的副本触发器检查inserted表中插入的新行数据,确定是否需要撤销或执行其他操作INSERT触发器的工作原理:14INSERT触发器示例3-1问题:解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应该自动更新对应帐户的余额。分析:在交易信息表上创建INSERT触发器从inserted临时表中获取插入的数据行根据交易类型(transType)字段的值是存入/支取,增加/减少对应帐户的余额。15-------关键代码------CREATETRIGGERtrig_transInfoONtransInfoFORINSERTASDECLARE@typechar(4),@outMoneyMONEYDECLARE@myCardIDchar(10),@balanceMONEYSELECT@type=transType,@outMoney=transMoney,@myCardID=cardIDFROMinsertedIF(@type='支取')UPDATEbankSETcurrentMoney=currentMoney-@outMoneyWHEREcardID=@myCardIDELSEUPDATEbankSETcurrentMoney=currentMoney+@outMoneyWHEREcardID=@myCardID…..GOINSERT触发器示例3-2从inserted表中获取交易类型、交易金额等根据交易类型,减少或增加对应卡号的余额16INSERT触发器示例3-317transInfocardIDtransTypetransMoney1001000210010002存入300存入50010010001支取200DELETE触发器transInfocardIDtransTypetransMoney1001000210010002存入300存入500deletedcardIDtransTypetransMoney10010001支取200删除记录行触发delete触发器向deleted表中插入被删除的副本触发器检查deleted表中被删除的数据,决定是否需要撤销或执行其他操作DELETE触发器的工作原理:18问题:当删除交易信息表时,要求自动备份被删除的数据到表backupTable中。分析:在交易信息表上创建DELETE触发器被删除的数据可以从deleted表中获取DELETE触发器示例3-119-------关键代码------CREATETRIGGERtrig_delete_transInfoONtransInfoFORDELETEASprint'开始备份数据,请稍后......'IFNOTEXISTS(SELECT*FROMsysobjectsWHEREname='backupTable')SELECT*INTObackupTableFROMdeletedELSEINSERTINTObackupTableSELECT*FROMdeletedprint'备份数据成功,备份表中的数据为:'SELECT*FROMbackupTableGO从deleted表中获取被删除的交易记录DELETE触发器示例3-220DELETE触发器示例3-321Deleted(更新前的数据)customerNamecardIDcurrentMoney李四100000021bankcustomerNamecardIDcurrentMoney张三100100011000李四100000021UPDATE触发器删除记录行向deleted表中插入被删除的副本检查deleted和inserted表中的数据,确定是否需要撤销或执行其他操作UPDATE触发器的工作原理:李四1000000220001向inserted表中插入被添加的副本Inserted(更新后的数据)customerNamecardIDcurrentMoney李四1000000220001插入记录行22问题:跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。分析:在bank表上创建UPDATE触发器修改前的数据可以从deleted表中获取修改后的数据可以从inserted表中获取UPDATE触发器示例3-123-------关键代码------CREATETRIGGERtrig_update_bankONbankFORUPDATEASDECLARE@beforeMoneyMONEY,@afterMoneyMONEYSELECT@beforeMoney=currentMoneyFROMdeletedSELECT@afterMoney=currentMoneyFROMinsertedIFABS(@afterMoney-@beforeMoney)20000BEGINprint'交易金额:'+convert(varchar(8),ABS(@afterMoney-@beforeMoney))RAISERROR('每笔交易不能超过2万元,交易失败',16,1)ROLLBACKTRANSACTIONENDGO从deleted表中获取交易前的余额,从inserted表中获取交易后的余额UPDATE触发器3-2交易金额是否2万撤销事务,撤销交易24UPDATE触发器3-325列级UPDATE触发器3-1UPDATE触发器除了跟踪数据的变化(修改)外,还可以检查是否修改了某列的数据使用UPDATE(列)函数检测是否修改了某列问题:交易日期一般由系统自动产生,默认为当前日期。为了安全起见,一般禁止修改,以防舞弊。分析:UPDATE(列名)函数可以检测是否修改了某列26-------关键代码------CREATETRIGGERtrig_update_transInfoONtransInfoFORUPDATEASIFUPDATE(transDate)BEGINprint'交易失败.....'RAISERROR(‘安全警告:交易日期不能修改,由系统自动产生',16,1)ROLLBACKTRANSACTIONENDGO检查是否修改了交易日期列transDate撤销事务,撤销交易列级UPDATE触发器3-227列级UPDATE触发器3-32、DDL触发器。•与DML触发器一样,DDL触发器也是通过事件来激活并执行其中的SQL语句。•与DML触发器不同,DDL触发器是在响应数据定义语言(DDL)语句时激发。•以CREATE、ALTER和DROP开头的语句。•DDL触发器可用于管理任务,例如审核和控制数据库操作。DDL触发器功能(1)防止对数据库架构进行某些更改。(2)使得数据库中发生某种情况,以响应数据库架构中的更改。(3)记录数据库架构中的更改或事件。具有数据库范围的DDL触发器CREATETRIGGERsafetyONDATABASEFORDROP_TABLEASRAISERROR('YoumustdisableTriggersafetytodroptable!',10,1)ROLLBACK具有服务器范围的DDL触发器CREATETRIGGERddl_trig_databaseONALLSERVERFORCREATE_DATABASEASPRINT'DatabaseCreated.'SELECTEVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')31登录触发器CREATETRIGGERconnection_limit_triggerONALLSERVERWITHEXECUTEAS'sa'FORLOGONASBEGINIFORIGINAL_LOGIN()='sa'AND(SELECTCOUNT(*)FROMsys.dm_exec_s
本文标题:T-SQL触发器解析
链接地址:https://www.777doc.com/doc-6843385 .html