手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQL Server 利用触发器对多表视图进行更新的实现方法
SQL Server 利用触发器对多表视图进行更新的实现方法
摘要:其步骤就是:利用update操作触发器产生的2个虚拟表【inserted】用来存储修改的数据信息和【deleted】表,然后将对应的数据更新...

其步骤就是:利用update操作触发器产生的2个虚拟表【inserted】用来存储修改的数据信息和【deleted】表,然后将对应的数据更新到对应数据表中的字段信息中;

SQL Server 利用触发器对多表视图进行更新的实现方法1

1.首先创建3个表:

a.信息表:

USE [SQL-LI] BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB --创建命名为【XINXIN_TAB】的数据表,同时不允许字段为空 CREATE TABLE XINXIN_TAB ( 姓名 NVARCHAR(10) NOT NULL, 性别 NVARCHAR(1) NOT NULL, 学号 INT NOT NULL, 班级 NVARCHAR(20) NOT NULL, 出生日期 DATE NOT NULL, CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED ([学号]ASC) ) COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB GO

b.明细分数表:

USE [SQL-LI] CREATE TABLE FENSHU_TAB ( [学号] INT NOT NULL, [语文] DECIMAL(3,1) NOT NULL, [数学] DECIMAL(3,1) NOT NULL, [英语] DECIMAL(3,1) NOT NULL ) GO

c.综合分数表:

USE [SQL-LI] CREATE TABLE ZHONGHE_TAB ( [姓名] NVARCHAR(10) NOT NULL, [学号] INT NOT NULL, [总分] DECIMAL(4,1) NOT NULL, [平均分] DECIMAL(3,1) NOT NULL) GO

2.1.【信息表】和【明细分数表】插入对应表中的数据:

USE [SQL-LI] --插入【XINXIN_TAB】表中的5条记录 INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[学号] ,[性别] ,[班级] ,[出生日期] ) VALUES('李晓峰',6080,'男','计算机','2013-05-03') INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[学号] ,[性别] ,[班级] ,[出生日期] ) VALUES('李晓峰1',6081,'男','计算机1','2013-05-04') INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[学号] ,[性别] ,[班级] ,[出生日期] ) VALUES('李晓峰2',6082,'男','计算机2','2013-05-05') INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[学号] ,[性别] ,[班级] ,[出生日期] ) VALUES('李晓峰3',6083,'男','计算机3','2013-05-06') INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[学号] ,[性别] ,[班级] ,[出生日期] ) VALUES('张晓',6084,'女','美术','2013-05-07') --插入【FENSHU_TAB】表中的5条记录 INSERT INTO [DBO].FENSHU_TAB ([学号] ,[语文] ,[数学] ,[英语] ) VALUES(6080,99.5,98.6,59.2) INSERT INTO [DBO].FENSHU_TAB ([学号] ,[语文] ,[数学] ,[英语] ) VALUES(6081,93.5,94.3,55.8) INSERT INTO [DBO].FENSHU_TAB ([学号] ,[语文] ,[数学] ,[英语] ) VALUES(6082,96.5,78.6,58.5) INSERT INTO [DBO].FENSHU_TAB ([学号] ,[语文] ,[数学] ,[英语] ) VALUES(6083,99.5,68.4,89.2) INSERT INTO [DBO].FENSHU_TAB ([学号] ,[语文] ,[数学] ,[英语] ) VALUES(6084,99.7,98.7,59.4) GO

【信息表】的数据:

SQL Server 利用触发器对多表视图进行更新的实现方法2

【明细分数表】的数据:

SQL Server 利用触发器对多表视图进行更新的实现方法3

2.2.运算记录【综合分数表】的数据:

插入【ZHONGHE_TAB】中的数据 USE [SQL-LI] --声明3个变量分别用来接收【平均分】,【总分】,【姓名】,和一个控制循环的条件变量@I_WHILE_XUEHAO DECLARE @I_WHILE_XUEHAO INT,@ZONGFEN DECIMAL(4,1),@AVGFEN DECIMAL(3,1),@XINGMING NVARCHAR(10); SELECT @I_WHILE_XUEHAO =6080; --使这个变量【@I_WHILE_XUEHAO】的值指定在【学号】字段上 WHILE(@I_WHILE_XUEHAO >=6080 AND @I_WHILE_XUEHAO <6085) BEGIN --求取【平均分】,【总分】,【姓名】并存在声明的变量中 SELECT @ZONGFEN =(F.语文 +F.数学 +F.英语 ),@AVGFEN =(F.语文 +F.数学 +F.英语 )/3,@XINGMING =X.姓名 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.学号 =F.学号 WHERE X.学号 =@I_WHILE_XUEHAO --与【学号同步】 --将其变量的数据插入到【ZHONGHE_TAB】的对应字段上 INSERT INTO [DBO].ZHONGHE_TAB ([姓名] ,[学号] ,[平均分] ,[总分] ) VALUES(@XINGMING ,@I_WHILE_XUEHAO ,@AVGFEN ,@ZONGFEN ) SELECT @I_WHILE_XUEHAO +=1; --与【学号同步】 END GO

【综合分数表】的数据:

SQL Server 利用触发器对多表视图进行更新的实现方法4

3.1.1.创建3个表关联的视图:

USE [SQL-LI] GO CREATE VIEW SHITU_FFENSHU_XINXI(姓名,学号,平均分,总分,班级,出生日期) AS SELECT TOP 800 X.姓名 ,F.学号 ,Z.平均分 ,Z.总分 ,X.班级 ,X.出生日期 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.学号 =F.学号 INNER JOIN [DBO].ZHONGHE_TAB AS Z ON F.学号 =Z.学号 ORDER BY F.学号 ASC GO

查看创建的视图:

SQL Server 利用触发器对多表视图进行更新的实现方法5

3.2.1.通过视图修改多个数据表的信息????:

UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI] SET [姓名] = 'aaaaa', --此字段在【信息表】中 [平均分] =111 --此次字段在【分数】中 WHERE [学号]=6080 GO

结果:

SQL Server 利用触发器对多表视图进行更新的实现方法6

SQL Server 利用触发器对多表视图进行更新的实现方法7

下面就写个利用触发器对其多表进行更新的方法:

a.这里就利用instead of 代替触发来代替对各表中的字段内的信息进行修改:

USE [SQL-LI] GO CREATE TRIGGER TRIGG_UPDATE --创建一个upda触发器DML --关联到[SHITU_FFENSHU_XINXI]视图上 ON[DBO].[SHITU_FFENSHU_XINXI] INSTEAD OF UPDATE --代替触发器执行UPDATE功能;【但是只能定义一个增删改的INSTEAD OF代替触发】。 AS --声明接受变量用于存储【inserted】表上的数据 DECLARE @XINGMING NVARCHAR(10),@XUEHAO INT,@AVGFEN DECIMAL(3,1),@ZONGFEN DECIMAL(4,1), @BANJI NVARCHAR(20),@CHUSHENGRIQI DATE; --筛选【inserted】表中学号最小的一行数据 SELECT @XUEHAO =MIN(学号) FROM[inserted] --遍历【inserted】表 WHILE(@XUEHAO IS NOT NULL) BEGIN --将【inserted】表中的数据存放到相应的变量中 SELECT @XUEHAO =MIN([学号])FROM[inserted] WHERE [学号]=@XUEHAO SELECT @XINGMING=[姓名] FROM[inserted] WHERE[学号] =@XUEHAO SELECT @AVGFEN=[平均分]FROM[inserted] WHERE[学号] =@XUEHAO SELECT @ZONGFEN=[总分] FROM[inserted] WHERE[学号] =@XUEHAO SELECT @BANJI =[班级]FROM[inserted] WHERE[学号] =@XUEHAO SELECT @CHUSHENGRIQI=[出生日期]FROM[inserted] WHERE[学号] =@XUEHAO --找出视图中的字段对应相应表的字段 /*因为视图中的[姓名]/[班级]/[出生日期]字段是XINXIN_TAB 中的字段,故修改【XINXIN_TAB】中对应的字段 数据之*/ UPDATE[DBO].XINXIN_TAB SET [姓名]=@XINGMING ,[班级]=@BANJI ,[出生日期]=@CHUSHENGRIQI WHERE[学号]=@XUEHAO --道理同上 UPDATE[DBO].FENSHU_TAB SET[学号]=@XUEHAO WHERE[学号]=@XUEHAO --道理同上 UPDATE[DBO].ZHONGHE_TAB SET[平均分]=@AVGFEN ,[总分]=@ZONGFEN WHERE[学号]=@XUEHAO --修改完成后就开始筛选【inserted】表中下一条数据记录 SELECT @XUEHAO =MIN([学号])FROM[inserted] WHERE[学号]>@XUEHAO --然后给while中判断 END GO

a1.注意的是视图不是数据表没有存放数据,将从【inserted】表中的数据提取后赋给对应数据表内的字段中;

SQL Server 利用触发器对多表视图进行更新的实现方法8

对象资源管理器中的图示:

SQL Server 利用触发器对多表视图进行更新的实现方法9

3.万事俱备,开始通过视图修改多表中的数据(验证):

a

USE [SQL-LI] --查看未修改前的视图数据信息 SELECT* FROM[DBO].SHITU_FFENSHU_XINXI GO UPDATE[DBO].SHITU_FFENSHU_XINXI --修改【SHITU_FFENSHU_XINXI】中对应的字段数据 SET[姓名]='liyifeng' ,[平均分]=66.6 ,[总分]=88.8 ,[班级]='计算机SQLServer' ,[出生日期]='2013-05-05' --修改筛选 WHERE[学号]=6080 GO --查看修改后的视图数据信息 SELECT* FROM[DBO].SHITU_FFENSHU_XINXI GO

修改前后对比的结果图示:

SQL Server 利用触发器对多表视图进行更新的实现方法10

修改后的数据表中的数据:

USE [SQL-LI] SELECT* FROM[XINXIN_TAB] WHERE[学号]=6080 SELECT* FROM[FENSHU_TAB] WHERE[学号]=6080 SELECT* FROM[ZHONGHE_TAB] WHERE[学号]=6080 GO

SQL Server 利用触发器对多表视图进行更新的实现方法11

4.触发器在数据库里面就像颗炸弹一样,只要满足气要求就会被触发,就会对数据库里面的数据进行触发修改,所以不需要室就尽量将其关闭掉,用的时候就将其开启:

关闭:

USE [SQL-LI] GO DISABLE TRIGGER [DBO].TRIGG_UPDATE --关闭触发器【TRIGG_UPDATE】 ON SHITU_FFENSHU_XINXI GO

SQL Server 利用触发器对多表视图进行更新的实现方法12

开启:

USE [SQL-LI] GO ENABLE TRIGGER [DBO].TRIGG_UPDATE --开启触发器【TRIGG_UPDATE】 ON[DBO].[SHITU_FFENSHU_XINXI] --触发器所在的视图 GO

SQL Server 利用触发器对多表视图进行更新的实现方法13

GO

希望我写的能为你解决一点问题,还望指教!谢谢!

【SQL Server 利用触发器对多表视图进行更新的实现方法】相关文章:

Sql Server 2000 行转列的实现(横排)

SQLServer 快速备份的十种方法

SQL Server导入、导出、备份数据方法

SQL Server 2005 开启数据库远程连接的方法

SQL Server各种日期计算方法(收藏)

SQL Server 不删除信息重新恢复自动编号列的序号的方法

SQL Server 2005 Management Studio Express企业管理器将英文变成简体中文版的实现方法

清除SQLServer日志的两种方法

SQLServer 触发器 数据库进行数据备份

SQL Server2008中删除重复记录的方法分享

精品推荐
分类导航