目录
DML触发器1.AFTER触发器2.INSTEADOF触发器触发器
为执行业务规则和保持数据完整性而提供的一种机制,可以在插入、更新、删除等前后自动触发。
DML触发器
AFTER触发器(FOR)
INSERT/UPDATE/DELETE等,INSTEADOF触发器,约束之后激发
deleted表&inserted表,是由数据库引擎自动生成,与生成触发器基表结构一致。保存的数据对应如下表:
deletedinsertedupdate更新前更新后insert插入delete删除--update()函数,检查更新列,指定更新相应列时更才更新IFOBJECT_ID('dbo.tgr_voc','TR')ISNOTNULLDROPTRIGGERdbo.tgr_vocGOCREATETRIGGERdbo.tgr_vocONdbo.vocAFTERUPDATEASIFUPDATE(item)ORUPDATE(quantity)BEGINIFOBJECT_ID('dbo.voc_up','U')ISNOTNULLDROPTABLEdbo.voc_upSELECT*intodbo.voc_upFROMdeletedALTERTABLEdbo.voc_upADDdate_datetimeDEFAULTGETDATE()ALTERTABLEdbo.voc_upADDnotevarchar(10)DEFAULT'更新前'UPDATEdbo.voc_upSETdate_=GETDATE(),note='更新前'INSERTINTOdbo.voc_up(item,color,quantity,note)SELECTitem,color,quantity,'更新后'ASnoteFROMinsertedENDGOUPDATEdbo.vocSETquantity=10WHEREitem='yizi'ANDcolor='red'SELECT*FROMdbo.voc_upGO--设置First和Last触发器EXECsp_settriggerorder'tgr_voc','first','UPDATE'GO--查询触发器是否为First/Last触发器--第二个参数还可以是:ExecIsFirstDeleteTrigger,ExecIsFirstInsertTrigger,ExecIsLastUpdateTrigger,ExecIsLastDeleteTrigger,ExecIsLastInsertTriggerSELECTOBJECTPROPERTY(OBJECT_ID(N'tgr_voc'),'ExecIsFirstUpdateTrigger')--inserted表INSERTINTOdbo.vocOUTPUTinserted.*VALUES('yizi','red',10)GO--deleted表DELETEFROMdbo.vocOUTPUTdeleted.*WHEREitem='yizi'ANDquantity=10GO
INSTEADOF触发器
约束之前激发
优点:使不能更新的视图支持更新。基于多个基表的视图必须使用INSTEADOF触发器来对多个表进行更新、插入和删除。
--如插入item,color已在,则更新quantity;如不,则插入IFOBJECT_ID('dbo.tr_instead_insert_duplicates','TR')ISNOTNULLDROPTRIGGERdbo.tr_instead_insert_duplicatesGOCREATETRIGGERdbo.tr_instead_insert_duplicatesONdbo.vocINSTEADOFINSERTASBEGINIFEXISTS(SELECT*FROMdbo.vocv,insertediWHEREv.color=i.colorANDv.item=i.item)BEGINUPDATEdbo.vocSETquantity=dbo.voc.quantity+inserted.quantityFROMinsertedWHEREdbo.voc.color=inserted.colorANDdbo.voc.item=inserted.itemENDELSEBEGININSERTINTOdbo.vocSELECT*FROMinsertedENDENDGOINSERTINTOdbo.vocVALUES('yizi','red',5)INSERTINTOdbo.voc--单行插入有效VALUES('yizi','yellow',10),('yizi','yellow',10)GOSELECT*FROMdbo.voc
DDL触发器
主要响应CREATE/ALTER/DROP开头的语句。
用于执行管理任务,如审核和控制数据库操作。
只能AFTER。
启动&禁用触发器
--禁用触发器DISABLETRIGGERdbo.tr_instead_insert_duplicatesONdbo.vocGOALTERTABLEdbo.vocDISABLETRIGGERtr_instead_insert_duplicates--不能用dbo.GO--启动ALTERTABLEdbo.vocENABLETRIGGERtr_instead_insert_duplicatesGO