您的位置:首页 > 数据库

创建和触发sql2005视图中的触发器

2011-02-15 09:23 429 查看
document.body.oncopy=function(){
if(window.clipboardData){
setTimeout(function(){
vartext=clipboardData.getData("text");
if(text&&text.length>300){
text=text+"\r\n\n本文来自CSDN博客,转载请标明出处:"+location.href;
clipboardData.setData("text",text);
}
},100);
}
}
functionStorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}
以前只知道表可以创建触发器,今天刚知道原来视图也可以。今天刚测试了一下,把遇到的一些小问题记录下来,省得以后再走弯路。

有表A和表B,组成视图v_c,在视图中直接添加触发器时,语法如下:

createTRIGGERTR_V_DETAIL

INSTEADOFinsert/update/delete
AS...

注意点:

1.是“INSTEADOFinsert”,而不能直接使用insert/update/delete,否则会报视图不存在或者语法错误。

2.视图中的触发器,只是在视图修改的时候才会触发,(添加触发器后,可以用sql语句添加,修改视图的信息)

3.给视图添加的触发器,在修改视图中的单张表或者视图中的多张表的时候,都不会触发该触发器,只是在添加,修改视图中的数据的时候,才会触发
今天把代码补上:
--建立主表
CREATETABLETBM(
IDINTNOTNULLPRIMARYKEY,--ID
MDATAINTNOTNULL--数据
)
GO
--建立从表
CREATETABLETBD(
IDINTNOTNULL,--ID
ITMINTNOTNULL,--序号
DDATAINTNOTNULL,--数据
CONSTRAINTPK_TBDPRIMARYKEYCLUSTERED(ID,ITM)
)
GO
)
GO
--建立视图
CREATEVIEWV_DETAIL
AS
SELECTA.ID,A.MDATA,B.ITM,B.DDATA
FROMTBMALEFTJOINTBDB
ONA.ID=B.ID
GO
--插入几条原始数据
INSERTTBMSELECT1,101UNIONALLSELECT2,102
INSERTTBDSELECT1,1,211UNIONALLSELECT1,2,212GO
--视图显示
SELECT*FROMV_DETAILGO--建立视图触发器,有了视图触发器后,客户端可以只对视图进行增删改操作
CREATETRIGGERTR_V_DETAIL
ONV_DETAIL
INSTEADOFINSERT,UPDATE,DELETE
AS
SETNOCOUNTON--这个是为了不返回受影响的行数
--删除从表
DELETEA
FROMTBDA,DELETEDD
WHEREA.ID=D.ID
ANDA.ITM=D.ITM
ANDNOTEXISTS(--修改数据的情况不需要删除
SELECT1
FROMINSERTED
WHEREID=D.ID
ANDITM=D.ITM
)
--删除主表
DELETEA
FROMTBMA,DELETEDD
WHEREA.ID=D.ID
ANDNOTEXISTS(--修改数据的情况不需要删除
SELECT1
FROMINSERTED
WHEREID=D.ID
)
ANDNOTEXISTS(--有其他从表数据不能删除
SELECT1
FROMTBD
WHEREID=D.ID
)
--修改从表数据
UPDATEASET
DDATA=I.DDATA
FROMTBDA,INSERTEDI
WHEREA.ID=I.ID
ANDA.ITM=I.ITM
--修改主表数据
UPDATEASET
MDATA=I.MDATA
FROMTBMA,INSERTEDI
WHEREA.ID=I.ID
--插入主表数据(这个不是太明白,为什么需要按照inserted表的id分组,取mdata的最大值)
INSERTTBM(ID,MDATA)
SELECTID,MAX(MDATA)ASMDATA
FROMINSERTEDI
WHERENOTEXISTS(--不插入已经存在的数据
SELECT1
FROMTBM
WHEREID=I.ID
)
GROUPBYID
--插入从表数据
INSERTTBD(ID,ITM,DDATA)
SELECTID,ITM,DDATA
FROMINSERTEDI
WHERENOTEXISTS(--不插入已经存在的数据
SELECT1
FROMTBD
WHEREID=I.ID
ANDITM=I.ITM
)
GO
--1.测试一条插入原有主表的数据
INSERTV_DETAIL(ID,ITM,MDATA,DDATA)VALUES(2,1,102,221)

SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果只插入从表
--2.测试一次插入两条的数据
INSERTV_DETAIL(ID,ITM,MDATA,DDATA)SELECT3,1,103,231UNIONALLSELECT3,2,103,232
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果只插入一条主表数据,两条从表数据
--3.测试修改一条从表数据
UPDATEV_DETAILSETDDATA=1000WHEREID=3ANDITM=1
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果:主表数据不变,从表数据更新

--4.测试修改主从两表数据
UPDATEV_DETAILSETDDATA=900,MDATA=800WHEREID=3
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果:主表数据修改,从表数据也修改
--5.测试删除只有一条从表数据的纪录
DELETEV_DETAILWHEREID=2ANDITM=1
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果主表数据一起删除,执行的时候是先删除从表的数据,在删除主表的数据的时候,从表数据已经被删除,所以主表中的数据会被一起删除

--6.测试删除有多条从表数据的记录中的一条
DELETEV_DETAILWHEREID=1ANDITM=1
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果主表数据保留,删除主表的时候,从表中还有数据未全部删除
--7.测试删除一个主表ID的所有记录
DELETEV_DETAILWHEREID=3
SELECT*FROMV_DETAIL
SELECT*FROMTBM
SELECT*FROMTBDGO--结果主从表数据一起删除??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: