触发器Word格式文档下载.docx
- 文档编号:21726247
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:84.87KB
触发器Word格式文档下载.docx
《触发器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《触发器Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
PRDIDINTNOTNULL,--物品ID
STOIDINTNOTNULL,--仓库ID
QTYINTNOTNULLDEFAULT(0),--数量
MONNUMERIC(10,2)DEFAULT(0)--金额
)
GO
CREATETABLEPRDIN(
PRICENUMERIC(10,2)DEFAULT(0)--单价
CREATETABLEPRDOUT(
CREATETRIGGERTR_PRDIN
ONPRDIN
FORINSERT,DELETE,UPDATE
AS
SETNOCOUNTON
--已有的更新数量和金额
UPDATESSET
QTY=S.QTY+T.QTY,
MON=S.MON+T.MON
FROMSTORES,
(
SELECT
PRDID,
STOID,
QTY=SUM(QTY),
MON=SUM(MON)
FROM(
SELECT
QTY,
MON=QTY*PRICE
FROMINSERTED
UNIONALL
QTY=-QTY,
MON=-QTY*PRICE
FROMDELETED
)AST1
GROUPBY
STOID
)AST
WHERES.PRDID=T.PRDIDAND
S.STOID=T.STOID
--没有的插入数据
INSERTSTORE(
MON)
SELECT
FROM(
WHERENOTEXISTS(
1
FROMSTORES
WHERES.PRDID=T.PRDIDAND
)
GROUPBY
CREATETRIGGERTR_PRDOUT
ONPRDOUT
QTY=QTY,
--测试插入一行PRDIN
INSERTPRDIN
VALUES(1,100,20,11.6)
SELECT*FROMSTORE
--结果
--测试插入多行PRDIN
SELECT1,100,30,12.2
UNIONALL
SELECT2,101,50,100.2
这里1,100的会增加上去,而2,101的新增
--测试插入多行PRDOUT
INSERTPRDOUT
SELECT1,100,25,11.8
SELECT2,101,25,99.9
总结:
统计类触发器在某些统计需求的实现中可以发挥自己的作用,它一定程度上可以减少重复的统计工作和分散服务器的高峰期压力,在性能上发挥其作用,具体的应用有:
1、库存、已经完成量等冗余表数据或者冗余字段数据的统计,往往这些统计数据又作为其他业务的控制数据,需要及时统计。
2、一些比较复杂结构的数据更新,往往需要附带更新相关数据的应用,比如BOM结构中用量数据的修改。
统计类触发器的编写往往很难,主要难点在于业务的多样性,必需完全了解业务数据间的所有影响,同时需要全面考虑数据修改得各种可能性。
触发器综述之五
视图触发器
在SQLSERVER2000增加了视图触发器功能后,利用它可以解决以前版本对视图数据修改引起的基表数据修改不正确和有时会报错的问题。
视图触发器都是用INSTEADOF触发器,根据业务需要,和视图基表的情况,把对视图数据的修改解释为对基表数据的修改,从而实现客户端只需要直接对视图操作,而不必了解基表的情况,把视图当作一个表来对待。
从技术上,这类触发器很可能把INSERT,UPDATE,DELETE分来写触发器,从而降低触发器的难度,但是都要求对视图的业务关系非常熟悉,知道视图数据的各种修改对应基表做什么样的变化。
从性能上来说,视图的增删改操作比较频繁,数据量也不小,对性能的要求比较高,需要在触发器代码注意性能的提高,必要的时候需要用基表的索引或者视图的索引来提高性能。
下面用一个简化了的主从表视图例子来说明这类触发器。
一个主表TBM和一个从表TBD是一对多关系,形成一个视图,要求客户端可以直接增删改视图的数据:
--建立主表
CREATETABLETBM(
IDINTNOTNULLPRIMARYKEY,--ID
MDATAINTNOTNULL--数据
--建立从表
CREATETABLETBD(
IDINTNOTNULL,--ID
ITMINTNOTNULL,--序号
DDATAINTNOTNULL,--数据
CONSTRAINTPK_TBDPRIMARYKEYCLUSTERED(ID,ITM)
--建立视图
CREATEVIEWV_DETAIL
SELECTA.ID,A.MDATA,B.ITM,B.DDATA
FROMTBMALEFTJOINTBDB
ONA.ID=B.ID
--插入几条原始数据
INSERTTBMSELECT1,101UNIONALLSELECT2,102
INSERTTBDSELECT1,1,211UNIONALLSELECT1,2,212
--视图显示
SELECT*FROMV_DETAIL
--结果数据如下
--建立视图触发器,有了视图触发器后,客户端可以只对视图进行增删改操作
CREATETRIGGERTR_V_DETAIL
ONV_DETAIL
INSTEADOFINSERT,UPDATE,DELETE
--删除从表
DELETEA
FROMTBDA,DELETEDD
WHEREA.ID=D.ID
ANDA.ITM=D.ITM
ANDNOTEXISTS(--修改数据的情况不需要删除
SELECT1
WHEREID=D.ID
ANDITM=D.ITM
--删除主表
FROMTBMA,DELETEDD
ANDNOTEXISTS(--有其他从表数据不能删除
SELECT1
FROMTBD
--修改从表数据
UPDATEASET
DDATA=I.DDATA
FROMTBDA,INSERTEDI
WHEREA.ID=I.ID
ANDA.ITM=I.ITM
--修改主表数据
MDATA=I.MDATA
FROMTBMA,INSERTEDI
--插入主表数据
INSERTTBM(ID,MDATA)
SELECTID,MAX(MDATA)ASMDATA
FROMINSERTEDI
FROMTBM
WHEREID=I.ID
GROUPBYID
--插入从表数据
INSERTTBD(ID,ITM,DDATA)
SELECTID,ITM,DDATA
ANDITM=I.ITM
--测试一条插入原有主表的数据
INSERTV_DETAIL(ID,ITM,MDATA,DDATA)VALUES(2,1,102,221)
SELECT*FROMTBM
SELECT*FROMTBD
--结果只插入从表
-
-测试一次插入两条的数据
INSERTV_DETAIL(ID,ITM,MDATA,DDATA)SELECT3,1,103,231UNIONALLSELECT3,2,103,232
--结果只插入一条主表数据
-测试修改一条从表数据
UPDATEV_DETAILSET
DDATA=1000
WHEREID=3
ANDITM=1
--测试修改主从两表数据
DDATA=900,
MDATA=800
--测试删除只有一条从表数据的纪录
DELETEV_DETAIL
WHEREID=2
--结果主表数据一起删除
-测试删除有多条从表数据的记录中的一条
WHEREID=1
--结果主表数据保留
-测试删除一个主表ID的所有记录
WHEREID=3
--结果主从表数据一起删除
利用视图触发器可以使得视图具有直接增删改的功能,这样在某些应用中可以使得前端程序编写简单,把视图当作一个表来操作。
本文来自CSDN博客,转载请标明出处:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触发器