SQL Server 利用觸發(fā)器對(duì)多表視圖進(jìn)行更新的實(shí)現(xiàn)方法
其步驟就是:利用update操作觸發(fā)器產(chǎn)生的2個(gè)虛擬表【inserted】用來(lái)存儲(chǔ)修改的數(shù)據(jù)信息和【deleted】表,然后將對(duì)應(yīng)的數(shù)據(jù)更新到對(duì)應(yīng)數(shù)據(jù)表中的字段信息中;

1.首先創(chuàng)建3個(gè)表:
a.信息表:
USE [SQL-LI] BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB --創(chuàng)建命名為【XINXIN_TAB】的數(shù)據(jù)表,同時(shí)不允許字段為空 CREATE TABLE XINXIN_TAB ( 姓名 NVARCHAR(10) NOT NULL, 性別 NVARCHAR(1) NOT NULL, 學(xué)號(hào) INT NOT NULL, 班級(jí) NVARCHAR(20) NOT NULL, 出生日期 DATE NOT NULL, CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED ([學(xué)號(hào)]ASC) ) COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB GO
b.明細(xì)分?jǐn)?shù)表:
USE [SQL-LI] CREATE TABLE FENSHU_TAB ( [學(xué)號(hào)] INT NOT NULL, [語(yǔ)文] DECIMAL(3,1) NOT NULL, [數(shù)學(xué)] DECIMAL(3,1) NOT NULL, [英語(yǔ)] DECIMAL(3,1) NOT NULL ) GO
c.綜合分?jǐn)?shù)表:
USE [SQL-LI] CREATE TABLE ZHONGHE_TAB ( [姓名] NVARCHAR(10) NOT NULL, [學(xué)號(hào)] INT NOT NULL, [總分] DECIMAL(4,1) NOT NULL, [平均分] DECIMAL(3,1) NOT NULL) GO
2.1.【信息表】和【明細(xì)分?jǐn)?shù)表】插入對(duì)應(yīng)表中的數(shù)據(jù):
USE [SQL-LI]
--插入【XINXIN_TAB】表中的5條記錄
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號(hào)] ,[性別] ,[班級(jí)] ,[出生日期] )
VALUES('李曉峰',6080,'男','計(jì)算機(jī)','2013-05-03')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號(hào)] ,[性別] ,[班級(jí)] ,[出生日期] )
VALUES('李曉峰1',6081,'男','計(jì)算機(jī)1','2013-05-04')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號(hào)] ,[性別] ,[班級(jí)] ,[出生日期] )
VALUES('李曉峰2',6082,'男','計(jì)算機(jī)2','2013-05-05')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號(hào)] ,[性別] ,[班級(jí)] ,[出生日期] )
VALUES('李曉峰3',6083,'男','計(jì)算機(jī)3','2013-05-06')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號(hào)] ,[性別] ,[班級(jí)] ,[出生日期] )
VALUES('張曉',6084,'女','美術(shù)','2013-05-07')
--插入【FENSHU_TAB】表中的5條記錄
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號(hào)] ,[語(yǔ)文] ,[數(shù)學(xué)] ,[英語(yǔ)] )
VALUES(6080,99.5,98.6,59.2)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號(hào)] ,[語(yǔ)文] ,[數(shù)學(xué)] ,[英語(yǔ)] )
VALUES(6081,93.5,94.3,55.8)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號(hào)] ,[語(yǔ)文] ,[數(shù)學(xué)] ,[英語(yǔ)] )
VALUES(6082,96.5,78.6,58.5)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號(hào)] ,[語(yǔ)文] ,[數(shù)學(xué)] ,[英語(yǔ)] )
VALUES(6083,99.5,68.4,89.2)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號(hào)] ,[語(yǔ)文] ,[數(shù)學(xué)] ,[英語(yǔ)] )
VALUES(6084,99.7,98.7,59.4)
GO
【信息表】的數(shù)據(jù):

【明細(xì)分?jǐn)?shù)表】的數(shù)據(jù):

2.2.運(yùn)算記錄【綜合分?jǐn)?shù)表】的數(shù)據(jù):
插入【ZHONGHE_TAB】中的數(shù)據(jù) USE [SQL-LI] --聲明3個(gè)變量分別用來(lái)接收【平均分】,【總分】,【姓名】,和一個(gè)控制循環(huán)的條件變量@I_WHILE_XUEHAO DECLARE @I_WHILE_XUEHAO INT,@ZONGFEN DECIMAL(4,1),@AVGFEN DECIMAL(3,1),@XINGMING NVARCHAR(10); SELECT @I_WHILE_XUEHAO =6080; --使這個(gè)變量【@I_WHILE_XUEHAO】的值指定在【學(xué)號(hào)】字段上 WHILE(@I_WHILE_XUEHAO >=6080 AND @I_WHILE_XUEHAO <6085) BEGIN --求取【平均分】,【總分】,【姓名】并存在聲明的變量中 SELECT @ZONGFEN =(F.語(yǔ)文 +F.數(shù)學(xué) +F.英語(yǔ) ),@AVGFEN =(F.語(yǔ)文 +F.數(shù)學(xué) +F.英語(yǔ) )/3,@XINGMING =X.姓名 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.學(xué)號(hào) =F.學(xué)號(hào) WHERE X.學(xué)號(hào) =@I_WHILE_XUEHAO --與【學(xué)號(hào)同步】 --將其變量的數(shù)據(jù)插入到【ZHONGHE_TAB】的對(duì)應(yīng)字段上 INSERT INTO [DBO].ZHONGHE_TAB ([姓名] ,[學(xué)號(hào)] ,[平均分] ,[總分] ) VALUES(@XINGMING ,@I_WHILE_XUEHAO ,@AVGFEN ,@ZONGFEN ) SELECT @I_WHILE_XUEHAO +=1; --與【學(xué)號(hào)同步】 END GO
【綜合分?jǐn)?shù)表】的數(shù)據(jù):

3.1.1.創(chuàng)建3個(gè)表關(guān)聯(lián)的視圖:
USE [SQL-LI] GO CREATE VIEW SHITU_FFENSHU_XINXI(姓名,學(xué)號(hào),平均分,總分,班級(jí),出生日期) AS SELECT TOP 800 X.姓名 ,F.學(xué)號(hào) ,Z.平均分 ,Z.總分 ,X.班級(jí) ,X.出生日期 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.學(xué)號(hào) =F.學(xué)號(hào) INNER JOIN [DBO].ZHONGHE_TAB AS Z ON F.學(xué)號(hào) =Z.學(xué)號(hào) ORDER BY F.學(xué)號(hào) ASC GO
查看創(chuàng)建的視圖:

3.2.1.通過(guò)視圖修改多個(gè)數(shù)據(jù)表的信息????:
UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI] SET [姓名] = 'aaaaa', --此字段在【信息表】中 [平均分] =111 --此次字段在【分?jǐn)?shù)】中 WHERE [學(xué)號(hào)]=6080 GO
結(jié)果:


下面就寫(xiě)個(gè)利用觸發(fā)器對(duì)其多表進(jìn)行更新的方法:
a.這里就利用instead of 代替觸發(fā)來(lái)代替對(duì)各表中的字段內(nèi)的信息進(jìn)行修改:
USE [SQL-LI]
GO
CREATE TRIGGER TRIGG_UPDATE --創(chuàng)建一個(gè)upda觸發(fā)器DML
--關(guān)聯(lián)到[SHITU_FFENSHU_XINXI]視圖上
ON[DBO].[SHITU_FFENSHU_XINXI]
INSTEAD OF UPDATE --代替觸發(fā)器執(zhí)行UPDATE功能;【但是只能定義一個(gè)增刪改的INSTEAD OF代替觸發(fā)】。
AS
--聲明接受變量用于存儲(chǔ)【inserted】表上的數(shù)據(jù)
DECLARE @XINGMING NVARCHAR(10),@XUEHAO INT,@AVGFEN DECIMAL(3,1),@ZONGFEN DECIMAL(4,1),
@BANJI NVARCHAR(20),@CHUSHENGRIQI DATE;
--篩選【inserted】表中學(xué)號(hào)最小的一行數(shù)據(jù)
SELECT @XUEHAO =MIN(學(xué)號(hào)) FROM[inserted]
--遍歷【inserted】表
WHILE(@XUEHAO IS NOT NULL)
BEGIN
--將【inserted】表中的數(shù)據(jù)存放到相應(yīng)的變量中
SELECT @XUEHAO =MIN([學(xué)號(hào)])FROM[inserted] WHERE [學(xué)號(hào)]=@XUEHAO
SELECT @XINGMING=[姓名] FROM[inserted] WHERE[學(xué)號(hào)] =@XUEHAO
SELECT @AVGFEN=[平均分]FROM[inserted] WHERE[學(xué)號(hào)] =@XUEHAO
SELECT @ZONGFEN=[總分] FROM[inserted] WHERE[學(xué)號(hào)] =@XUEHAO
SELECT @BANJI =[班級(jí)]FROM[inserted] WHERE[學(xué)號(hào)] =@XUEHAO
SELECT @CHUSHENGRIQI=[出生日期]FROM[inserted] WHERE[學(xué)號(hào)] =@XUEHAO
--找出視圖中的字段對(duì)應(yīng)相應(yīng)表的字段
/*因?yàn)橐晥D中的[姓名]/[班級(jí)]/[出生日期]字段是XINXIN_TAB 中的字段,故修改【XINXIN_TAB】中對(duì)應(yīng)的字段
數(shù)據(jù)之*/
UPDATE[DBO].XINXIN_TAB
SET [姓名]=@XINGMING ,[班級(jí)]=@BANJI ,[出生日期]=@CHUSHENGRIQI
WHERE[學(xué)號(hào)]=@XUEHAO
--道理同上
UPDATE[DBO].FENSHU_TAB
SET[學(xué)號(hào)]=@XUEHAO
WHERE[學(xué)號(hào)]=@XUEHAO
--道理同上
UPDATE[DBO].ZHONGHE_TAB
SET[平均分]=@AVGFEN ,[總分]=@ZONGFEN
WHERE[學(xué)號(hào)]=@XUEHAO
--修改完成后就開(kāi)始篩選【inserted】表中下一條數(shù)據(jù)記錄
SELECT @XUEHAO =MIN([學(xué)號(hào)])FROM[inserted] WHERE[學(xué)號(hào)]>@XUEHAO
--然后給while中判斷
END
GO
a1.注意的是視圖不是數(shù)據(jù)表沒(méi)有存放數(shù)據(jù),將從【inserted】表中的數(shù)據(jù)提取后賦給對(duì)應(yīng)數(shù)據(jù)表內(nèi)的字段中;

對(duì)象資源管理器中的圖示:

3.萬(wàn)事俱備,開(kāi)始通過(guò)視圖修改多表中的數(shù)據(jù)(驗(yàn)證):
a
USE [SQL-LI] --查看未修改前的視圖數(shù)據(jù)信息 SELECT* FROM[DBO].SHITU_FFENSHU_XINXI GO UPDATE[DBO].SHITU_FFENSHU_XINXI --修改【SHITU_FFENSHU_XINXI】中對(duì)應(yīng)的字段數(shù)據(jù) SET[姓名]='liyifeng' ,[平均分]=66.6 ,[總分]=88.8 ,[班級(jí)]='計(jì)算機(jī)SQLServer' ,[出生日期]='2013-05-05' --修改篩選 WHERE[學(xué)號(hào)]=6080 GO --查看修改后的視圖數(shù)據(jù)信息 SELECT* FROM[DBO].SHITU_FFENSHU_XINXI GO
修改前后對(duì)比的結(jié)果圖示:

修改后的數(shù)據(jù)表中的數(shù)據(jù):
USE [SQL-LI] SELECT* FROM[XINXIN_TAB] WHERE[學(xué)號(hào)]=6080 SELECT* FROM[FENSHU_TAB] WHERE[學(xué)號(hào)]=6080 SELECT* FROM[ZHONGHE_TAB] WHERE[學(xué)號(hào)]=6080 GO

4.觸發(fā)器在數(shù)據(jù)庫(kù)里面就像顆炸彈一樣,只要滿足氣要求就會(huì)被觸發(fā),就會(huì)對(duì)數(shù)據(jù)庫(kù)里面的數(shù)據(jù)進(jìn)行觸發(fā)修改,所以不需要室就盡量將其關(guān)閉掉,用的時(shí)候就將其開(kāi)啟:
關(guān)閉:
USE [SQL-LI] GO DISABLE TRIGGER [DBO].TRIGG_UPDATE --關(guān)閉觸發(fā)器【TRIGG_UPDATE】 ON SHITU_FFENSHU_XINXI GO

開(kāi)啟:
USE [SQL-LI] GO ENABLE TRIGGER [DBO].TRIGG_UPDATE --開(kāi)啟觸發(fā)器【TRIGG_UPDATE】 ON[DBO].[SHITU_FFENSHU_XINXI] --觸發(fā)器所在的視圖 GO

GO
希望我寫(xiě)的能為你解決一點(diǎn)問(wèn)題,還望指教!謝謝!
- 細(xì)說(shuō)SQL Server中的視圖
- 簡(jiǎn)析SQL Server數(shù)據(jù)庫(kù)用視圖來(lái)處理復(fù)雜的數(shù)據(jù)查詢關(guān)系
- 解析SQL Server 視圖、數(shù)據(jù)庫(kù)快照
- Sql Server中的系統(tǒng)視圖詳細(xì)介紹
- Sql Server中的視圖介紹
- SQL SERVER先判斷視圖是否存在然后再創(chuàng)建視圖的語(yǔ)句
- sql server判斷數(shù)據(jù)庫(kù)、表、列、視圖是否存在
- SQL server 視圖(view)介紹
- 存儲(chǔ)過(guò)程解密(破解函數(shù),過(guò)程,觸發(fā)器,視圖.僅限于SQLSERVER2000)
- SQL Server視圖的講解
相關(guān)文章
win2003安裝sqlserver 2000提示無(wú)法驗(yàn)證產(chǎn)品密鑰的解決方法
由于腳本之家的安全設(shè)置,刪除了很多安全隱患的東西,也導(dǎo)致了一些軟件安裝出現(xiàn)錯(cuò)誤,所以建議大家在安裝好軟件再安全設(shè)置。今天就出現(xiàn)了安全sql2000時(shí)提示提示無(wú)法驗(yàn)證產(chǎn)品密鑰,下面的具體的解決方法。2011-07-07
一個(gè)比較實(shí)用的大數(shù)據(jù)量分頁(yè)存儲(chǔ)過(guò)程
一個(gè)比較實(shí)用的大數(shù)據(jù)量分頁(yè)存儲(chǔ)過(guò)程...2006-08-08
SQL Server存儲(chǔ)過(guò)程同時(shí)返回分頁(yè)結(jié)果集和總數(shù)
這篇文章主要為大家詳細(xì)介紹了SQL Server存儲(chǔ)過(guò)程同時(shí)返回分頁(yè)結(jié)果集和總數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
SQLServer"通過(guò)端口1433連接到主機(jī)localhost的TCP/IP連接失敗"常見(jiàn)問(wèn)題的解
今天碰到一個(gè)問(wèn)題,查了很久,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java通過(guò)JDBC連接SQLServer?2012出現(xiàn)"通過(guò)端口1433連接到主機(jī)localhost的TCP/IP連接失敗"常見(jiàn)問(wèn)題的解決方案,需要的朋友可以參考下2023-05-05
insert into tbl() select * from tb2中加入多個(gè)條件
insert into tbl() select * from tb2中加入多個(gè)條件2009-06-06
將表里的數(shù)據(jù)批量生成INSERT語(yǔ)句的存儲(chǔ)過(guò)程 增強(qiáng)版
這篇文章主要介紹了將表里的數(shù)據(jù)批量生成INSERT語(yǔ)句的存儲(chǔ)過(guò)程 增強(qiáng)版的相關(guān)資料,需要的朋友可以參考下2015-12-12

