创建和触发sql2005视图中的触发器
2010-08-04 17:46
891 查看
以前只知道表可以创建触发器,今天刚知道原来视图也可以。今天刚测试了一下,把遇到的一些小问题记录下来,省得以后再走弯路。
有表A和表B,组成视图v_c,在视图中直接添加触发器时,语法如下:
createTRIGGERTR_V_DETAIL
有表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--结果主从表数据一起删除??
相关文章推荐
- 创建和触发sql2005视图中的触发器
- 创建和触发sql2005视图中的触发器
- VC++ 表格、完整性约束、视图、触发器、存储过程的创建SQL语句
- 创建触发器报PL/SQL: ORA-00942: 表或视图不存在
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.5.2 使用SQL创建视图
- mssql:t-sql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程;触发器trigger
- 创建数据库、表、主外键、各种约束、存储过程、视图、索引、事务使用、触发器、创建登录账号、数据库用户 Sql语句示例
- mssql:t-sql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程;触发器trigger;播放器http://www.smartgz.com/blog/Article/956.asp
- sql 创建动态视图,动态列
- 详解Sql2005 全文索引创建及应用(2)
- 【T_SQL】 基础 视图、存储过程、触发器
- 通过Jdbc执行sql在数据库中创建一个视图
- 【SQL模板】二.创建表视图模板TSQL
- 【Oracle 11g】我们的触发器竟然触发了两次!——诱因:sql重启动
- Sql2005自动备份并邮件通知状态之二创建维护计划
- sql server 2000/2005 判断存储过程、触发器、视图是否存在并删除
- Sql2005 基于已存在的表创建分区
- syscomments 存储系统存储过程、用户存储过程、视图、函数、触发器等对象的sql定义语句
- sql 视图创建索引
- 关于在xp系统上sql2005创建用户失败的问题