對MSsql Server的view使用instead of trigger進行視圖更新

來源:互聯網
上載者:User
server|視圖
       最近常常使用VIEW,但MSsql Server不允許對關聯兩個基表以上的VIEW進行更新操作。由於項目上的需要,花了一個晚上的時間研究了一下。抽點時間把過程和心得記錄下來。

       先看看權威說法:

 

可更新視圖:

Microsoft SQL Server 2000 以兩種方法增強可更新視圖的類別:

 

INSTEAD OF 觸發器:可以在視圖上建立 INSTEAD OF 觸發器,以使視圖可更新。執行 INSTEAD OF 觸發器,而不是執行定義觸發器的資料修改語句。該觸發器使使用者得以指定一套處理資料修改語句時需要執行的操作。因此,如果在給定的資料修改語句(INSERT、UPDATE 或 DELETE)上存在視圖的 INSTEAD OF 觸發器,則通過該語句可更新相應的視圖。有關 INSTEAD OF 觸發器的更多資訊,請參見設計 INSTEAD OF 觸發器。

 

分區視圖:如果視圖屬於稱為"分區視圖"的指定格式,則該視圖的可更新性受限於某些限制。本主題稍後將討論分區視圖及其可更新性。

必要時,SQL Server 將"本機資料分割檢視"辨別為所有參與表和視圖都在同一 SQL Server 上的視圖,而將"分散式資料分割檢視"辨別為視圖中至少有一個表駐留在不同(遠程)伺服器上的視圖。

 

如果視圖沒有 INSTEAD OF 觸發器,或者視圖不是分區視圖,則視圖只有滿足下列條件才可更新:

 

select_statement 在挑選清單中沒有彙總函式,也不包含 TOP、GROUP BY、UNION(除非視圖是本主題稍後要描述的分區視圖)或 DISTINCT 子句。彙總函式可以用在 FROM 子句的子查詢中,只要不修改函數返回的值。有關更多資訊,請參見彙總函式。

 

select_statement 的挑選清單中沒有衍生的資料行。衍生的資料行是由任何非簡單列運算式(使用函數、加法或減法運算子等)所構成的結果集列。

 

select_statement 中的 FROM 子句至少引用一個表。select_statement 必須不僅只包含非表格格式的運算式(即不是從表派生出的運算式)。例如,以下視圖是不可更新的:

CREATE VIEW NoTable AS

SELECT GETDATE() AS CurrentDate,

       @@LANGUAGE AS CurrentLanguage,

       CURRENT_USER AS CurrentUser

 

INSERT、UPDATE 和 DELETE 語句在可以引用可更新視圖之前,也必須如上述條件指定的那樣滿足某些限制條件。只有當視圖可更新,並且所編寫的 UPDATE 或 INSERT 語句只修改視圖的 FROM 子句引用的一個基表中的資料時,UPDATE 和 INSERT 語句才能引用視圖。只有當視圖在其 FROM 子句中只引用一個表時,DELETE 語句才能引用可更新的視圖。

 

分區視圖比較麻煩,本文採用INSTEAD OF 觸發器的方法解決!

我的實驗如下:先建立兩個表Table1、Table2。表結構分別如下:



備忘:

1,  其中Table2中的d欄位為自動性,步長為預設值1

2,  Table1中的a欄位為自動性,步長為預設值1

 

然後,建立視圖VIEW1:

SELECT dbo.Table2.d, dbo.Table2.e, dbo.Table1.b, dbo.Table1.c

FROM dbo.Table2 INNER JOIN

      dbo.Table1 ON dbo.Table2.a = dbo.Table1.a

顯然,該視圖包含欄位d,e,b,c四個欄位

 

問題很明確?如何向這個視圖增加資料呢?幾番嘗試最終得到正確的sql為:

CREATE TRIGGER Trig_INS_VIEW1 ON VIEW1

INSTEAD OF INSERT

AS

 

DECLARE @a INT

DECLARE @b INT

BEGIN

SET NOCOUNT ON

 

INSERT INTO Table1 SELECT b,c FROM inserted

select @a=(max(a)+1) from Table1

select @b=e from inserted

INSERT INTO Table2(a,e) VALUES (@a,@b)

 

END


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。