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

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

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

【信息表】的数据:

【明细分数表】的数据:

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

【综合分数表】的数据:

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

查看创建的视图:

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

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

结果:

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

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】表中的数据提取后赋给对应数据表内的字段中;

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

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

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

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

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

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

关闭:

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

开启:

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

GO

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

时间: 2024-09-22 09:49:40

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

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

其步骤就是:利用update操作触发器产生的2个虚拟表[inserted]用来存储修改的数据信息和[deleted]表,然后将对应的数据更新到对应数据表中的字段信息中: 1.首先创建3个表: a.信息表: USE [SQL-LI] BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB --创建命名为[XINXIN_TAB]的数据表,同时不允许字段为空 CREATE TABLE XINXIN_TAB ( 姓名 NVARCHAR(10) NOT NULL, 性别 NVARC

SQL Server 利用触发器对多表视图进行更新

原文 http://www.cnblogs.com/liyifeng/archive/2013/05/05/3056968.html 其步骤就是:利用update操作触发器产生的2个虚拟表[inserted]用来存储修改的数据信息和[deleted]表,然后将对应的数据更新到对应数据表中的字段信息中: 1.首先创建3个表: a.信息表: 1 USE [SQL-LI] 2 BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB 3 --创建命名为[XINXIN_TAB]的数

SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.Zuowenjun.cn) --CreateDate:2015-06-02 --Function:分页获取数据 /******************/ crea

使用IBM Data Movement Tool从SQL Server/Oracle到DB2的表数据迁移

SQL Server,Oracle 及 DB2 都是目前市场上很多应用程序所使用的关系型数据库,随着应用程序功能的日趋强大,应用程序的版本升级和重新安装都将要求保留原有数据.这样不同类型数据库之间的迁移成了现在应用程序功能中数据迁移部分的重点.目前市场上出现了一些数据库迁移工具(比如:IBM Data Movement Tool).互联网上针对这些工具的介绍大部分都是基于数据对象的整体迁移,也就是在数据结构迁移的基础上进行数据迁移.但是有些应用程序并不需要数据结构的迁移,而是仅仅需要表数据的迁移

SQL Server 2005:向系统表说再见

微软的SQL Server 数据库管理员 ,快快想一下!在不使用任何的文档的情况下,编写一个查询,从SQL Server 2000系统表中抽取索引的列表,然后列举每个索引中的字段,并判断这个字段是否按照升序或者降序进行排序.你有两分钟的时间.快!  如果你现在真的停下阅读,开始用必不可少的两分钟时间思考这项不讨好的任务,那么现在你就陷入了一个大麻烦中,这里面涉及了系统索引.系统索引关键字,系统字段,以及一些元数据函数,其中包括类似OBJECT_NAME 和INDEXKEY_PROPERTY这样的

SQL Server利用HashKey计算列解决宽字段查询的性能问题

SQL Server利用HashKey计算列解决宽字段查询的性能问题 主人翁        本文主人翁:MSSQL菜鸟和MSSQL老鸟. 问题提出        某年某月某日,某MSSQL菜鸟满脸愁容的跑到老鸟跟前,心灰意懒的对老鸟说"我最近遇到一个问题,很大的问题,对,非常大的问题".老鸟不急不慢的推了推2000度超级近视眼镜框,慢吞吞的说:"说来听听".        "我有一个100万数据量的表,有一个宽度为7500字段,不幸的是现在我需要根据这个字

MSSQL-应用案例-SQL Server 2016基于内存优化表的列存储索引分析Web Access Log

问题引入 在日常的网站运维工作中,我们需要对网站客户端访问情况做统计.汇总.分析和报表展示,以数据来全面掌控网站运营和访问情况.当不可预知的意外情况发生时,我们可以快速发现问题以及采取相应的措施.比如:当网站受到黑客攻击时的流量陡增,又或者是网站某个资源发生意外抛异常等情况. 在提供Web服务的服务器上,比如IIS.Apache都存在访问日志记录,这篇是文章是以SQL Server 2016基于内存优化表的列存储索引来分析Apache Web Access Log为例,讲解分析网站访问情况,因此

SQL server 2008 触发器

问题描述 SQL server 2008 触发器 sql server 中创建触发器,当表中的任意一列的数据更新时除了read_flag,将read_flag的置为0,这个触发器怎么写, CREATE TRIGGER trig_wmwhse4_SKU on wmwhse4.SKU instead of update as begin if (exists (select 1 from inserted a ,deleted b where a.STORERKEY = b.STORERKEY an

Sql Server中清空所有数据表中的记录_MsSql

Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 复制代码 代码如下: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: 复制代码 代码如下: exec sp_msforeachtable 'delete   N''?''' 清空SQL Server数据库中所有表数据的方法(有约束的情况) 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之