国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2024-08-31 00:48:04
字體:
來源:轉載
供稿:網友

       最近常常使用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
中國最大的web開發資源網站及技術社區,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵武市| 淮北市| 屏东市| 新密市| 平和县| 满洲里市| 响水县| 巴中市| 德令哈市| 潜江市| 柞水县| 孟州市| 华蓥市| 静乐县| 宁远县| 乌鲁木齐市| 福鼎市| 阿坝县| 盈江县| 永善县| 宝兴县| 肇州县| 元氏县| 贞丰县| 湖州市| 基隆市| 丹江口市| 开鲁县| 克拉玛依市| 游戏| 习水县| 荥阳市| 儋州市| 乌什县| 永年县| 黄龙县| 瑞昌市| 保康县| 新巴尔虎左旗| 武宁县| 呈贡县|