人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

SQL Server 利用觸發(fā)器對多表視圖進(jìn)行更新的實(shí)現(xiàn)方法

發(fā)布日期:2021-12-17 10:36 | 文章來源:站長之家

其步驟就是:利用update操作觸發(fā)器產(chǎn)生的2個虛擬表【inserted】用來存儲修改的數(shù)據(jù)信息和【deleted】表,然后將對應(yīng)的數(shù)據(jù)更新到對應(yīng)數(shù)據(jù)表中的字段信息中;

1.首先創(chuàng)建3個表:

a.信息表:

USE [SQL-LI]
BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB 
--創(chuàng)建命名為【XINXIN_TAB】的數(shù)據(jù)表,同時不允許字段為空
CREATE TABLE XINXIN_TAB
(
姓名 NVARCHAR(10) NOT NULL,
性別 NVARCHAR(1) NOT NULL,
學(xué)號 INT NOT NULL,
班級 NVARCHAR(20) NOT NULL,
出生日期 DATE NOT NULL,
CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED
([學(xué)號]ASC)
)
COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB
GO

b.明細(xì)分?jǐn)?shù)表:

USE [SQL-LI] 
CREATE TABLE FENSHU_TAB
(
[學(xué)號] INT NOT NULL,
[語文] DECIMAL(3,1) NOT NULL,
[數(shù)學(xué)] DECIMAL(3,1) NOT NULL,
[英語] DECIMAL(3,1) NOT NULL
)
GO

c.綜合分?jǐn)?shù)表:

USE [SQL-LI] 
CREATE TABLE ZHONGHE_TAB
(
[姓名] NVARCHAR(10) NOT NULL,
[學(xué)號] INT NOT NULL,
[總分] DECIMAL(4,1) NOT NULL,
[平均分] DECIMAL(3,1) NOT NULL)
GO

2.1.【信息表】和【明細(xì)分?jǐn)?shù)表】插入對應(yīng)表中的數(shù)據(jù):

USE [SQL-LI] 
--插入【XINXIN_TAB】表中的5條記錄
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號] ,[性別] ,[班級] ,[出生日期] )
VALUES('李曉峰',6080,'男','計(jì)算機(jī)','2013-05-03')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號] ,[性別] ,[班級] ,[出生日期] )
VALUES('李曉峰1',6081,'男','計(jì)算機(jī)1','2013-05-04')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號] ,[性別] ,[班級] ,[出生日期] )
VALUES('李曉峰2',6082,'男','計(jì)算機(jī)2','2013-05-05')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號] ,[性別] ,[班級] ,[出生日期] )
VALUES('李曉峰3',6083,'男','計(jì)算機(jī)3','2013-05-06')
INSERT INTO [DBO].XINXIN_TAB ([姓名] ,[學(xué)號] ,[性別] ,[班級] ,[出生日期] )
VALUES('張曉',6084,'女','美術(shù)','2013-05-07')
--插入【FENSHU_TAB】表中的5條記錄
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號] ,[語文] ,[數(shù)學(xué)] ,[英語] )
VALUES(6080,99.5,98.6,59.2)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號] ,[語文] ,[數(shù)學(xué)] ,[英語] )
VALUES(6081,93.5,94.3,55.8)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號] ,[語文] ,[數(shù)學(xué)] ,[英語] )
VALUES(6082,96.5,78.6,58.5)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號] ,[語文] ,[數(shù)學(xué)] ,[英語] )
VALUES(6083,99.5,68.4,89.2)
INSERT INTO [DBO].FENSHU_TAB ([學(xué)號] ,[語文] ,[數(shù)學(xué)] ,[英語] )
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個變量分別用來接收【平均分】,【總分】,【姓名】,和一個控制循環(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;
--使這個變量【@I_WHILE_XUEHAO】的值指定在【學(xué)號】字段上
WHILE(@I_WHILE_XUEHAO >=6080 AND @I_WHILE_XUEHAO <6085)
BEGIN
--求取【平均分】,【總分】,【姓名】并存在聲明的變量中
SELECT @ZONGFEN =(F.語文 +F.數(shù)學(xué) +F.英語 ),@AVGFEN =(F.語文 +F.數(shù)學(xué) +F.英語 )/3,@XINGMING =X.姓名 
FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.學(xué)號 =F.學(xué)號 
WHERE X.學(xué)號 =@I_WHILE_XUEHAO --與【學(xué)號同步】
--將其變量的數(shù)據(jù)插入到【ZHONGHE_TAB】的對應(yīng)字段上
INSERT INTO [DBO].ZHONGHE_TAB ([姓名] ,[學(xué)號] ,[平均分] ,[總分] )
VALUES(@XINGMING ,@I_WHILE_XUEHAO ,@AVGFEN ,@ZONGFEN )
SELECT @I_WHILE_XUEHAO +=1;  --與【學(xué)號同步】
END
GO

【綜合分?jǐn)?shù)表】的數(shù)據(jù):

3.1.1.創(chuàng)建3個表關(guān)聯(lián)的視圖:

USE [SQL-LI] 
GO
CREATE VIEW SHITU_FFENSHU_XINXI(姓名,學(xué)號,平均分,總分,班級,出生日期)
AS
SELECT TOP 800 X.姓名 ,F.學(xué)號 ,Z.平均分 ,Z.總分 ,X.班級 ,X.出生日期 
FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.學(xué)號 =F.學(xué)號 
  INNER JOIN [DBO].ZHONGHE_TAB AS Z ON F.學(xué)號 =Z.學(xué)號 
  ORDER BY F.學(xué)號 ASC
  GO

查看創(chuàng)建的視圖:

3.2.1.通過視圖修改多個數(shù)據(jù)表的信息????:

UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI]
SET [姓名] = 'aaaaa', --此字段在【信息表】中
[平均分] =111  --此次字段在【分?jǐn)?shù)】中
WHERE [學(xué)號]=6080
GO

結(jié)果:

下面就寫個利用觸發(fā)器對其多表進(jìn)行更新的方法:

a.這里就利用instead of 代替觸發(fā)來代替對各表中的字段內(nèi)的信息進(jìn)行修改:

USE [SQL-LI] 
GO
CREATE TRIGGER TRIGG_UPDATE --創(chuàng)建一個upda觸發(fā)器DML
--關(guān)聯(lián)到[SHITU_FFENSHU_XINXI]視圖上
ON[DBO].[SHITU_FFENSHU_XINXI]
INSTEAD OF UPDATE --代替觸發(fā)器執(zhí)行UPDATE功能;【但是只能定義一個增刪改的INSTEAD OF代替觸發(fā)】。
AS
--聲明接受變量用于存儲【inserted】表上的數(shù)據(jù)
DECLARE @XINGMING NVARCHAR(10),@XUEHAO INT,@AVGFEN DECIMAL(3,1),@ZONGFEN DECIMAL(4,1),
    @BANJI NVARCHAR(20),@CHUSHENGRIQI DATE;
    --篩選【inserted】表中學(xué)號最小的一行數(shù)據(jù)
SELECT @XUEHAO =MIN(學(xué)號) FROM[inserted] 
--遍歷【inserted】表
WHILE(@XUEHAO IS NOT NULL)
BEGIN
--將【inserted】表中的數(shù)據(jù)存放到相應(yīng)的變量中
SELECT @XUEHAO =MIN([學(xué)號])FROM[inserted] WHERE [學(xué)號]=@XUEHAO 
SELECT @XINGMING=[姓名] FROM[inserted] WHERE[學(xué)號] =@XUEHAO 
SELECT @AVGFEN=[平均分]FROM[inserted] WHERE[學(xué)號] =@XUEHAO 
SELECT @ZONGFEN=[總分] FROM[inserted] WHERE[學(xué)號] =@XUEHAO 
SELECT @BANJI =[班級]FROM[inserted] WHERE[學(xué)號] =@XUEHAO 
SELECT @CHUSHENGRIQI=[出生日期]FROM[inserted] WHERE[學(xué)號] =@XUEHAO 
--找出視圖中的字段對應(yīng)相應(yīng)表的字段
/*因?yàn)橐晥D中的[姓名]/[班級]/[出生日期]字段是XINXIN_TAB 中的字段,故修改【XINXIN_TAB】中對應(yīng)的字段
數(shù)據(jù)之*/
UPDATE[DBO].XINXIN_TAB 
SET [姓名]=@XINGMING ,[班級]=@BANJI ,[出生日期]=@CHUSHENGRIQI 
WHERE[學(xué)號]=@XUEHAO 
--道理同上
UPDATE[DBO].FENSHU_TAB 
SET[學(xué)號]=@XUEHAO 
WHERE[學(xué)號]=@XUEHAO 
--道理同上
UPDATE[DBO].ZHONGHE_TAB 
SET[平均分]=@AVGFEN ,[總分]=@ZONGFEN 
WHERE[學(xué)號]=@XUEHAO 
--修改完成后就開始篩選【inserted】表中下一條數(shù)據(jù)記錄
SELECT @XUEHAO =MIN([學(xué)號])FROM[inserted] WHERE[學(xué)號]>@XUEHAO
--然后給while中判斷 
END
GO

a1.注意的是視圖不是數(shù)據(jù)表沒有存放數(shù)據(jù),將從【inserted】表中的數(shù)據(jù)提取后賦給對應(yīng)數(shù)據(jù)表內(nèi)的字段中;

對象資源管理器中的圖示:

3.萬事俱備,開始通過視圖修改多表中的數(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】中對應(yīng)的字段數(shù)據(jù)
SET[姓名]='liyifeng' ,[平均分]=66.6 ,[總分]=88.8 ,[班級]='計(jì)算機(jī)SQLServer' ,[出生日期]='2013-05-05' 
--修改篩選
WHERE[學(xué)號]=6080 
GO
--查看修改后的視圖數(shù)據(jù)信息
SELECT* FROM[DBO].SHITU_FFENSHU_XINXI 
GO

修改前后對比的結(jié)果圖示:

修改后的數(shù)據(jù)表中的數(shù)據(jù):

USE [SQL-LI] 
SELECT* FROM[XINXIN_TAB] WHERE[學(xué)號]=6080
SELECT* FROM[FENSHU_TAB] WHERE[學(xué)號]=6080
SELECT* FROM[ZHONGHE_TAB] WHERE[學(xué)號]=6080
GO

4.觸發(fā)器在數(shù)據(jù)庫里面就像顆炸彈一樣,只要滿足氣要求就會被觸發(fā),就會對數(shù)據(jù)庫里面的數(shù)據(jù)進(jìn)行觸發(fā)修改,所以不需要室就盡量將其關(guān)閉掉,用的時候就將其開啟:

關(guān)閉:

USE [SQL-LI] 
GO
DISABLE TRIGGER [DBO].TRIGG_UPDATE --關(guān)閉觸發(fā)器【TRIGG_UPDATE】
ON SHITU_FFENSHU_XINXI
GO

開啟:

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

GO

希望我寫的能為你解決一點(diǎn)問題,還望指教!謝謝!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時開通

自選配置、實(shí)時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部