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

1.首先创建3个表:
a.信息表:

1 USE [SQL-LI]
2 BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB
3 --创建命名为【XINXIN_TAB】的数据表,同时不允许字段为空
4 CREATE TABLE XINXIN_TAB
5 (
6 姓名 NVARCHAR(10) NOT NULL,
7 性别 NVARCHAR(1) NOT NULL,
8 学号 INT NOT NULL,
9 班级 NVARCHAR(20) NOT NULL,
10 出生日期 DATE NOT NULL,
11 CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED
12 ([学号]ASC)
13 )
14 COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB
15 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.【信息表】和【明细分数表】插入对应表中的数据:
【信息表】的数据:

【明细分数表】的数据:

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

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

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

查看创建的视图:

3.2.1.通过视图修改多个数据表的信息????:
1 UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI]
2 SET [姓名] = 'aaaaa', --此字段在【信息表】中
3 [平均分] =111 --此次字段在【分数】中
4 WHERE [学号]=6080
5 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
希望我写的能为你解决一点问题,还望指教!谢谢!
转载:http://www.cnblogs.com/liyifeng/archive/2013/05/05/3056968.html
SQL Server 利用触发器对多表视图进行更新的更多相关文章
- sql server 2000能否得到一个表的最后更新日期?
如果是SQL 2005 或 2008.运行下面的代码.就可以看到从上次启动SQL 服务以来,某个表的使用情况,包括select/update/delete/insert. SELECT * FROM ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- SQL Server中查询数据库及表的信息语句
/* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
- Sql Server中清空所有数据表中的记录
Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable @Command1 ='truncate table ?'删除所有数据 ...
- sql server的数据库个数、表个数及表的数据量统计
sql server的数据库个数.表个数及表的数据量统计 --由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将写好的代码贴出来,用到如下的: --sysobje ...
- Sql Server中不常用的表运算符之UNPIVOT
在Sql Server中不常用的表运算符之PIVOT中,介绍了PIVOT表运算符,现在来说说与之相对应的另一个表运算符UNPIVOT. 从名字可以看出,这个运算符的作用与PIVOT刚好相反,是将一行的 ...
- Sql Server中不常用的表运算符之APPLY(2)
在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...
随机推荐
- vue 数组渲染问题
vue 数组渲染问题 问题一: 用v-for循环渲染数组数据时,数据更新了,视图却没有更新 由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 1. 当你利用索引直接设置一个项时, ...
- DBI-1.634之selectrow_array与fetchrow_array的区别
在DBI-1.634使用手册里有一个selectrow_array函数,该函数具体说明如下: This utility method combines "prepare", &qu ...
- 剑指Offer-不用加减乘除做加法
package Other; /** * 不用加减乘除做加法 * 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. * 思路:位运算 * 1.两个数异或:相当于每一位相加 ...
- Python十题(第2课)
一.天天向上的力量 C 一年365天,以第1天的能力值为基数,记为1.0.当好好学习时,能力值相比前一天提高N‰:当没有学习时,由于遗忘等原因能力值相比前一天下降N‰.每天努力或放任,一年下来的能力值 ...
- spring - boot 监控管理模块搭建
Spring-Actuator是Spring-boot对应用监控的集成模块,提供了我们对服务器进行监控的支持,使我们更直观的获取应用程序中加载的应用配置.环境变量.自动化配置报告等. 使用Spring ...
- 【Python】 http客户端库requests & urllib2 以及ip地址处理IPy
requests requests是个HTTPClient库,相比于urllib,urllib2等模块比更加简洁易用 ■ get请求 作为示例,讲一下关于requests如何发起并处理一个get请求 ...
- 透析thinkphp5升级版开发框架tpframe
这里将全面的介绍这个框架给我们开发带来的好处,让你们对它有更深层次的认识,喜欢或不喜欢的,欢迎大家前来留言讨论 一.目录层次结构 现在很多的项目,特别是大一点的项目里面,都会有很多的人参与,要进行程序 ...
- Java日志框架:logback详解
为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...
- alpha冲刺第十天
一.合照 二.项目燃尽图 三.项目进展 之前卡住的注册无法插入数据的问题解决 可以呈现多条数据内容了,首页文章内容呈现,问答界面问题内容呈现 四.明日规划 很多没有完善的,后面还是要继续整改 五.问题 ...
- 《Language Implementation Patterns》之 数据聚合符号表
本章学习一种新的作用域,叫做数据聚合作用域(data aggregate scope),和其他作用域一样包含符号,并在scope tree里面占据一个位置. 区别在于:作用域之外的代码能够通过一种特殊 ...