日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

细说Sql Server中的视图(下)转载

發布時間:2025/3/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 细说Sql Server中的视图(下)转载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? ?

原文:細說Sql Server中的視圖(下)http://www.cnblogs.com/xbf321/archive/2009/06/19/view_two_in_sqlserver.html

     1,什么是視圖?

????????????2,為什么要用視圖;

????????????3,視圖中的ORDER BY;

????????????4,刷新視圖;

????????????5,更新視圖;

????????????6,視圖選項;

????????????7,索引視圖;

??????細說Sql Server中的視圖(上)?????應大家要求已在“細說Sql Server中的視圖(上)”中添加“為什么要用視圖”一小節。

?5.更新視圖

??????視圖是一個虛擬表,我們在查詢視圖的時候,實際上是對基礎表的查詢。視圖不僅可以作為SELECT查詢的目標,也可以作為修改語句的目標。當然,當你修改視圖的時候,修改的時候是對基礎表的修改,它就好像是一個代理。當然,如果不允許直接修改基礎表,只允許修改視圖,就可以限制你要公開的數據。這樣,就可以對你的數據起到一定的保護作用,不過這種限制的時候很少。

??????那么在更新視圖的時候,有哪些限制條件呢?

??? 1,只要視圖有一列不能隱式獲取值,你就不能想視圖中插入數據,如果列允許NULL、有默認值或者IDETITY屬性,則說明它可以隱式獲取值;

??? 2,如果視圖包含聯結,UPDATE或INSERT語句只能影響聯結的一端。也就是說,INSERT或UPDATE語句必須定義目標列列表,這些列只能數據聯結的一端。你不能從由聯結查詢定義的視圖中刪除數據;

??? 3,不能修改作為計算結果的列。如:標量表達式和聚合函數,SqlServer不會嘗試改變數據庫引擎的計算結果;

??? 4,如果在創建或修改視圖時指定了WITH CHECK OPTION選項,與視圖的查詢篩選器有沖突的INSERT或UPDATE語句將被拒絕;我在“視圖選項”一節詳細講解一下。

?? 如果視圖上定義了INSERT OF觸發器,則違反這些限制的數據修改語句可以被執行。在INSERT OF觸發器中你可以用自己的代碼替換原始修改;

?? 當你允許對有聯結查詢定義的視圖執行修改的時候,一定要謹慎,比如一對多的關系,如果你根據“多”的某一索引值修改對應“一”端某列值的記錄,那么結果就可想而知;

?6.視圖選項

?? 當你創建或修改視圖時,可以指定一些選項,這些選項用戶控制視圖的行為和功能。

?? ENCRYPTION、SCHEMABINDING和VIEW_METADATA選項在視圖頭指定,CHECK OPTION選項則在查詢之后指定;

?? 如:????????

1: CREATE VIEW v2 2: WITH ENCRYPTION,SCHEMABINDING,VIEW_METADATA 3: AS 4: SELECT OrderID FROM dbo.Orders 5: WITH CHECK OPTION

??? 1),ENCRYPTION

如果你在構建任何類型的商業軟件的時候,需要對視圖進行加密的時候,這是一個不錯的選項。

如果未指定ENCRYPTION選項,SQLSERVEr則以純文本的形式保存用戶定義的語句,如果指定了ENCRYPTION選項,對象的文本則會被混淆。

SQLSERVER提供了一個系統函數sp_helptext查看視圖的文本,如果應用的ENCRYPTION選項,則會得到“The text for object ‘xx’ is encrypted”語句;

注:在加密之前一定要先備份你所要加密的視圖,一旦加密,就不能回頭。

??? 2),SCHEMABINDING

如果你使用SCHEMABINDING選項創建視圖,SQLSERVER將不允許刪除基礎表或修改被引用的列,防止在對底層對象修改時,使視圖變得“孤立”,如果某人沒有注意到你的視圖,執行了DROP,刪除視圖引用的列或其他一些操作,那就很糟糕。如果使用SCHEMABINDING選項,則就可以避免這種情況。

如果想在視圖上創建索引,則必須使用SCHMABINDING選項;

如果應用這個選項,則定義視圖的時候要注意兩點:

?? 1,所有對象必須由兩部分構成的名稱,如:應該使用dbo.Orders 而不能是Orders

?? 2,不能在SELECT列表使用*,所有的列名必須指定一個名稱;

??? 3),CHECK OPTION

使用WITH CHECK OPTION 創建的視圖能防止與視圖查詢篩選器有沖突的INSERT或UPDATE語句。沒有該選項,視圖可以接受不符合查詢篩選器的修改。比如:

我們在Northwind數據庫中創建一個CustomWithOrder的視圖,現在還沒有添加WITH CHECK OPTION選項?

1: CREATE VIEW CustomerWithOrder 2: WITH VIEW_METADATA 3: AS 4: ? 5: SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 6: WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID) 7: ? 該視圖的作用是查詢所有有訂單的客戶的id和公司名,接下來我們向視圖中插入一條不存在的用戶id,和公司名:
1: INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('MYSQL','MyReed') 執行成功,然后在查詢這個CustomerWithOrder視圖,很明顯,查詢不到CustomerID為’MySQL’的用戶,因為視圖只包含發生過訂單的用戶;如果你直接查詢Customers表,就會發現這個新增的用戶信息了。 接下來對CustomerWithOrder視圖添加WITH CHECK OPTION 選項? 1: ALTER VIEW CustomerWithOrder 2: WITH VIEW_METADATA 3: AS 4: ? 5: SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 6: WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID) 7: ? 8: WITH CHECK OPTION
然后再執行下面的語句:?

1: INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('ILSQL','MyReed')
你會收到以下錯誤:?

Msg 550, Level 16, State 1, Line 2?
試圖進行的插入或更新已失敗,原因是目標視圖或者目標視圖所跨越的某一視圖指定了 WITH CHECK OPTION,而該操作的一個或多個結果行又不符合 CHECK OPTION 約束。?
語句已終止。?

??? 4),VIEW_METADATA

該選項的作用是,讓視圖看起來更像一個真正的表。不使用該選項,返回給客戶端的api的元數據將是視圖所依賴的基礎表的數據;

如果客戶端希望SqlServer發送視圖的元數據信息,而不是基礎表的元數據時,可以在創建或修改視圖時指定此選項;是不是聽的很費勁,聽我慢慢說;

假設用戶擁有對視圖的操作權限,而沒有對基礎表操作的權限,那么用戶對視圖執行一些操作,如果指定了VIEW_METADATA選項,那么該語句將會違背安全而失敗,因為只要指定了VIEW_METADATA那么返回給客戶端就是視圖的元數據,而不是基礎表的元數據。另一方面,如果用戶嘗試通過視圖修改數據,而該操作又與視圖上定義的CHECK OPTION有沖突,這種操作只有直接提交到基礎表,才有可能成功。

SqlServer中就有這樣的工具,在SqlServer2000中,企業管理器就是,如果我們向視圖中插入一條記錄,比如向在有WITH CHECK OPTION選項的CustomerWithOrder視圖中插入一個任意的消費者無論存在與否,并打開跟蹤企業管理器提交到Sql Server中的操作,你會發現操作實際把基礎表作為目標提交的,及時他違背CHECK OPTION,也會成功。而在Sql Server2005中的SSMS中,就會不同了,如果在“Modify”視圖中,手動插入一條記錄,就可以成功,說明雖然指定了VIEW_METADATA和CHECK OPTION選項,它還是插入到了基礎表中了,可以跟蹤一下提交到Sqlserver的操作(用Sql server Profiler)。但如果在由“Open View”產生的面板中進行操作,將會失敗,提示:?
???

可以再次跟蹤提交到Sql server的操作,就能看到,他提交到目標對象是視圖;

還是那句話:如果客戶端希望SqlServer發送視圖的元數據信息,而不是基礎表的元數據時,可以在創建或修改視圖時指定此選項

這次明白了嗎?

?

??? 我個人總結,只要有VIEW_METADATA選項就有必要加上CHECK OPTION選項,而SCHEMABINDING選項,最好也要加上,防止你的視圖“孤立”,而在索引視圖中SCHEMABINDING選項是必須加上的。

?7.索引視圖

如果沒有索引,視圖中的數據不會有任何物理表現形似,如果加上索引,則就把視圖中的數據物理化了,SqlServer會在修改基礎表時同步索引視圖。但你不能直接同步視圖內容。

我們知道在表上創建索引,能提高性能,相同,在視圖也是一樣,在視圖上創建的第一個索引必須是唯一聚集索引,之后才可以創建其他的非聚集索引。

索引視圖必須使用SCHEMABINDING選項,并且不能引用其他視圖,只能引用基礎表和UDF,而基礎表和UDF必須使用兩部分命名約定來引用(參見5.視圖選項中的SCHEMABINDING選項)。

除了性能,你可能還會因為其他原因使用索引視圖,比如在一張基礎表中有一列我們要強制該列中已知值的唯一性,但是允許出現多次的NULL值,我們怎么辦呢,我們首先想到的可能是用UNIQUE約束,但是UNIQUE會認為兩個NULL值相等,那么這個不得不放棄了,那還有什么辦法呢?

其實我們可以利用一個索引視圖來完成這個任務,利用索引視圖篩選所有非NULL的數據,那么這種索引將防止重復的已知值進入基礎表,但允許多個NULL,因為NULL不是唯一索引的一部分,我們在向基礎表中插入數據的時候,就利用索引視圖的UNIQUE來限制我們的數據,來達到某列中強制已知值的唯一性的目的;

我們可以演示一下,首先創建一個基礎表T2和一個索引視圖V2:?

1: CREATE TABLE T2(col1 INT,col2 NVARCHAR(50)) 2: ? 3: CREATE VIEW V2 4: WITH SCHEMABINDING 5: AS 6: SELECT col1 FROM dbo.T2 WHERE col1 IS NOT NULL; 7: CREATE UNIQUE CLUSTERED INDEX idx_col1 ON dbo.V2(col1); 然后我們向T2表中插入以下數據: 1: INSERT INTO t2(col1,col2) VALUES(1,'2') 2: INSERT INTO t2(col1,col2) VALUES(1,'3') 3: INSERT INTO t2(col1,col2) VALUES(null,'4') 4: INSERT INTO t2(col1,col2) VALUES(null,'5')
那么以上4條INSERT哪條會失敗呢?答案是2。最后讓我們SELECT 一下基礎表T2,看實現我們開始那個要求了嗎? 1: SELECT * FROM t2

?

執行:?

?

轉載于:https://www.cnblogs.com/khfang/p/5783660.html

總結

以上是生活随笔為你收集整理的细说Sql Server中的视图(下)转载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av在线天天 | 一级爱爱免费视频 | 黄色网址www| 亚洲 小说区 图片区 都市 | 特淫毛片 | 国产aⅴ精品一区二区三区久久 | 亚洲精品中文字幕乱码三区91 | 成人精品三级av在线看 | 日韩精品在线第一页 | 91精品国产自产91精品 | 无码人妻精品一区二区三区9厂 | 国产拍拍视频 | 亚洲国产成人精品女人久久久 | 亚洲av成人精品一区二区三区 | 精品国产乱码久久久久久浪潮 | 熊猫电影yy8y全部免费观看 | 国产精品啪啪啪视频 | 欧美少妇18p | 人妻av无码一区二区三区 | 国产一级做a爰片久久毛片男 | 日本在线高清 | 成人二三区 | 六月色婷婷 | 一本大道东京热无码 | 一级黄色片视频 | 三级特黄 | 向日葵视频在线播放 | 不卡的一区二区 | 久久国产精品系列 | 国产特黄一级片 | 神马午夜嘿嘿 | 青青草青娱乐 | 动漫av在线| 成人在线午夜 | 91在线精品秘密一区二区 | 欧美日韩不卡一区 | 欧美日韩一区二区区 | 午夜视频黄 | 人人射人人爱 | 精品在线播放视频 | 黄色激情在线观看 | 成人免费a视频 | 日本精品一区在线 | 午夜精品极品粉嫩国产尤物 | 一本一道精品欧美中文字幕 | 亚洲黄色免费网站 | 欧美视频xxx | 欧洲av无码放荡人妇网站 | 日韩在线免费观看av | 午夜影院在线看 | 久久久久久av无码免费看大片 | 国产第一页在线 | 黄视频网站免费看 | 欧美黑人精品一区二区 | 日本成人在线不卡 | 精品一区二区三区在线观看视频 | av日韩高清 | 聚色av | 奇米精品一区二区三区四区 | 中文字幕一二三四区 | 99视频国产精品 | 国产按摩一区二区三区 | 一本色道久久hezyo加勒比 | 亚洲欧洲日本精品 | 香蕉视频免费在线观看 | 欧美精品一区二区免费 | 日韩av在线播放网址 | 豆花在线视频 | 亚洲精品乱码久久久久久日本蜜臀 | 久久激情免费视频 | 久久精品男人的天堂 | 九九热精品视频在线 | 国产激情一区二区三区在线观看 | 国产精品视频免费看 | sm一区二区三区 | a少妇| 天天躁狠狠躁 | 九色91丨porny丨丝袜 | 久热这里只有精品在线 | 丝瓜色版 | 中文字幕免费高清网站 | 天天插天天射天天干 | 欧日韩不卡视频 | 亚洲黄色网页 | 亚洲精品成人区在线观看 | 91蜜桃传媒精品久久久一区二区 | 国产精品乱码一区二区 | 欧美一区二区三区免费观看 | 天天天天躁天天爱天天碰2018 | 老色批网站 | 国产四区视频 | 久久久99国产精品免费 | 日本无遮羞调教打屁股网站 | 婷婷天堂 | 国产一区二区三区久久 | 亚洲综合视频在线观看 | 欧美乱大交xxxxx潮喷 | 国产精品秘 | 日韩色影院 |