其步骤就是:利用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_TABGO
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
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
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_XUEHAODECLARE @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;  --与【学号同步】ENDGO

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

USE [SQL-LI] GOCREATE VIEW SHITU_FFENSHU_XINXI(姓名,学号,平均分,总分,班级,出生日期)ASSELECT 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 [学号]=6080GO

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

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

USE [SQL-LI] GOCREATE 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中判断 ENDGO

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

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

a

USE [SQL-LI] --查看未修改前的视图数据信息SELECT* FROM[DBO].SHITU_FFENSHU_XINXI GOUPDATE[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[学号]=6080SELECT* FROM[FENSHU_TAB] WHERE[学号]=6080SELECT* FROM[ZHONGHE_TAB] WHERE[学号]=6080GO

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

关闭:

USE [SQL-LI] GODISABLE TRIGGER [DBO].TRIGG_UPDATE --关闭触发器【TRIGG_UPDATE】ON SHITU_FFENSHU_XINXIGO

开启:

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

GO

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

更多相关文章

  1. 如何去掉状态栏和内容视图之间的黑色阴影线
  2. android中文api(89)——ViewManager
  3. Android中的FILL_PARENT与WRAP_CONTENT的区别
  4. android用户界面-组件Widget-地图视图MapView
  5. Android(安卓)中文API(86)——ResourceCursorAdapter
  6. android用户界面-组件Widget-画廊视图Gallery
  7. android 中文api (62) —— ViewSwitcher.ViewFactory
  8. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
  9. android api 中文 (74)—— AdapterView.AdapterContextMenuInfo

随机推荐

  1. Android DisplayMetrics类简介
  2. Android SDK Platforms 提取下载
  3. 如何去写 Android(安卓)init.rc
  4. android 条码识别软件开发全解析(续1详解
  5. Android 学习笔记【基础扫盲篇】
  6. Android(安卓)UI布局优化的要点
  7. android 联系人详解
  8. Android中10个成功的开源项目
  9. Android推送通知的实现--Android推送通知
  10. android模拟器无法启动问题之中文路径