2010-04-15 39 views

回答

22

看到Using Views in Microsoft SQL Server

當通過視圖 修改數據(即,使用INSERT或UPDATE 語句)的某些限制存在 取決於視圖的類型。訪問多個表的視圖 只能修改視圖中其中一個表的 。 使用函數的視圖,指定 DISTINCT,或使用GROUP BY 子句可能不會更新。 另外,插入數據是禁止的以下類型的 視圖 :

* views having columns with derived (i.e., computed) data in the SELECT-list 
* views that do not contain all columns defined as NOT NULL from the tables from which they were defined 

還可以插入或 更新數據通過這樣的觀點,即 的數據不再通過 即查看訪問,除非已經指定WITH CHECK OPTION。

+0

有通過視圖插入如此多的告誡,我個人覺得它簡單直接插入到表。畢竟,爲了符合規則,並且您知道沒有理由不直接更新或插入表,您仍然需要查看哪些字段會出現在哪張表中。 – HLGEM 2010-04-16 13:42:57

+0

我從來沒有在視圖上實際執行UPDATE或INSERT,但如果您有可用於快速查找需要更改的行的索引視圖,則可能會有所幫助。在這種情況下,我將構建更新唯一目的的視圖。 – 2010-04-16 13:59:33

12

是的。

視圖中的數據不存在獨立於構成視圖的表的存在。本質上,這個視圖是一個僞裝成表的存儲SELECT語句。數據存儲在原始表格中,並且只有在您想查看時才「組裝」到視圖中。如果視圖是可更新的(並非所有視圖都是),則更新將應用於表數據。

+0

我明白你的觀點。但是出現了一個新問題,如果視圖只是一個選擇語句,那麼視圖上的索引如何維護。所有索引都會在有人查詢視圖時立即重建。 – 2010-04-15 20:10:11

+1

只有在基礎表上,視圖上沒有索引。當您從視圖請求數據時,DBMS使用這些索引組裝不同表中的行。 (這忽略了一種相當新的觀點,即數據庫存儲數據的「影子」副本的「物化視圖」,有效地爲你預先計算視圖)。 – 2010-04-15 20:16:50

5

您可以在視圖上使用觸發器對實際表格執行插入/更新/刪除操作。

http://www.devarticles.com/c/a/SQL-Server/Using-Triggers-In-MS-SQL-Server/1/

+4

我很欣賞我對答案的反饋,但如果它是否定的,爲什麼沒有人評論?如果錯了,我想糾正。 – 2010-04-16 18:30:54

+4

該問題明確詢問更新視圖的效果。提出替代方案非常好,但它並不能回答這個問題。 – Dan 2016-03-10 16:14:13