javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-03 12:49:55 | 查看: 463 | 回复: 0

目录

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

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017