最近常常使用 VIEW ,但 MS sql Server 不允許對關聯兩個基表以上的 VIEW 進行更新操作。由于項目上的需要,花了一個晚上的時間研究了一下。抽點時間把" name="description" />

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 對MSsql Server的view使用instead of trigger進行視圖更新

    發表于:2007-05-25來源:作者:點擊數: 標簽:viewinsteadMSSQLserver使用
    MI LY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近常常使用 VIEW ,但 MS sql Server 不允許對關聯兩個基表以上的 VIEW 進行更新操作。由于項目上的需要,花了一個晚上的時間研究了一下。抽點時間把

           MILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近常常使用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


    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>