其步驟就是:利用update操作觸發器產生的2個虛擬表【inserted】用來存儲修改的數據信息和【deleted】表,然后將對應的數據更新到對應數據表中的字段信息中;
1.首先創建3個表:
a.信息表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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.明細分數表:
1
2
3
4
5
6
7
8
9
|
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.綜合分數表:
1
2
3
4
5
6
7
8
|
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.【信息表】和【明細分數表】插入對應表中的數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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.運算記錄【綜合分數表】的數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
插入【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個表關聯的視圖:
1
2
3
4
5
6
7
8
9
|
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.通過視圖修改多個數據表的信息????:
1
2
3
4
5
|
UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI] SET [姓名] = 'aaaaa' , --此字段在【信息表】中 [平均分] =111 --此次字段在【分數】中 WHERE [學號]=6080 GO |
結果:
下面就寫個利用觸發器對其多表進行更新的方法:
a.這里就利用instead of 代替觸發來代替對各表中的字段內的信息進行修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 |
修改前后對比的結果圖示:
修改后的數據表中的數據:
1
2
3
4
5
|
USE [SQL-LI] SELECT * FROM [XINXIN_TAB] WHERE [學號]=6080 SELECT * FROM [FENSHU_TAB] WHERE [學號]=6080 SELECT * FROM [ZHONGHE_TAB] WHERE [學號]=6080 GO |
4.觸發器在數據庫里面就像顆炸彈一樣,只要滿足氣要求就會被觸發,就會對數據庫里面的數據進行觸發修改,所以不需要室就盡量將其關閉掉,用的時候就將其開啟:
關閉:
1
2
3
4
5
|
USE [SQL-LI] GO DISABLE TRIGGER [DBO].TRIGG_UPDATE --關閉觸發器【TRIGG_UPDATE】 ON SHITU_FFENSHU_XINXI GO |
開啟:
1
2
3
4
5
|
USE [SQL-LI] GO ENABLE TRIGGER [DBO].TRIGG_UPDATE --開啟觸發器【TRIGG_UPDATE】 ON [DBO].[SHITU_FFENSHU_XINXI] --觸發器所在的視圖 GO |
GO
希望我寫的能為你解決一點問題,還望指教!謝謝!