程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server 應用觸發器對多表視圖停止更新的完成辦法

SQL Server 應用觸發器對多表視圖停止更新的完成辦法

日期:2017/7/28 11:27:31      編輯:MSSQL

SQL Server 應用觸發器對多表視圖停止更新的完成辦法。本站提示廣大學習愛好者:(SQL Server 應用觸發器對多表視圖停止更新的完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 應用觸發器對多表視圖停止更新的完成辦法正文


其步調就是:應用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_TAB
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.【信息表】和【明細分數表】拔出對應表中的數據:

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_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個表聯系關系的視圖:

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.經由過程視圖修正多個數據表的信息????:

UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI]
SET [姓名] = 'aaaaa', --此字段在【信息表】中
[均勻分] =111  --此次字段在【分數】中
WHERE [學號]=6080
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

願望我寫的能為你處理一點成績,還望指教!感謝!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved