您的位置:首页 > 数据库

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

2010-08-04 17:46 891 查看
以前只知道表可以创建触发器,今天刚知道原来视图也可以。今天刚测试了一下,把遇到的一些小问题记录下来,省得以后再走弯路。

有表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--结果主从表数据一起删除??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: