SQL Server 利用觸發器對多表視圖進行更新


其步驟就是:利用update操作觸發器產生的2個虛擬表【inserted】用來存儲修改的數據信息和【deleted】表,然后將對應的數據更新到對應數據表中的字段信息中;

1.首先創建3個表:

a.信息表:

復制代碼
 1 USE [SQL-LI]
 2 BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB 
 3 --創建命名為【XINXIN_TAB】的數據表,同時不允許字段為空
 4 CREATE TABLE XINXIN_TAB
 5 (
 6 姓名 NVARCHAR(10) NOT NULL,
 7 性別 NVARCHAR(1) NOT NULL,
 8 學號 INT NOT NULL,
 9 班級 NVARCHAR(20) NOT NULL,
10 出生日期 DATE NOT NULL,
11 CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED
12 ([學號]ASC)
13 )
14 COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB
15 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.【信息表】和【明細分數表】插入對應表中的數據:

插入【信息表】和【明細分數表】的數據

 

【信息表】的數據:

【明細分數表】的數據:

2.2.運算記錄【綜合分數表】的數據:

 

插入【ZHONGHE_TAB】中的數據

 【綜合分數表】的數據:

3.1.1.創建3個表關聯的視圖:

復制代碼
 1 USE [SQL-LI] 
 2 GO
 3 CREATE VIEW SHITU_FFENSHU_XINXI(姓名,學號,平均分,總分,班級,出生日期)
 4 AS
 5 SELECT TOP 800 X.姓名 ,F.學號 ,Z.平均分 ,Z.總分 ,X.班級 ,X.出生日期 
 6 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.學號 =F.學號 
 7     INNER JOIN [DBO].ZHONGHE_TAB AS Z ON F.學號 =Z.學號 
 8     ORDER BY F.學號 ASC
 9     GO
10     
復制代碼

查看創建的視圖:

3.2.1.通過視圖修改多個數據表的信息????:

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

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

 

轉載:http://www.cnblogs.com/liyifeng/archive/2013/05/05/3056968.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM