修改視圖註意事項 修改先前創建的視圖。 其中包括索引視圖。 ALTER VIEW不影響相關的存儲過程或觸發器,並且不會更改許可權。 如果原來的視圖定義是使用 WITH ENCRYPTION 或 CHECK OPTION創建的,則只有在 ALTER VIEW 中也包含這些選項時,才會啟用這些選項。 如果 ...
修改視圖註意事項
修改先前創建的視圖。 其中包括索引視圖。 ALTER VIEW不影響相關的存儲過程或觸發器,並且不會更改許可權。
如果原來的視圖定義是使用 WITH ENCRYPTION 或 CHECK OPTION創建的,則只有在 ALTER VIEW 中也包含這些選項時,才會啟用這些選項。
如果當前所用的視圖使用 ALTER VIEW 來修改,則資料庫引擎使用對該視圖的排他架構鎖。 在授予鎖時,如果該視圖沒有活動用戶,則資料庫引擎將從過程緩存中刪除該視圖的所有副本。 引用該視圖的現有計劃將繼續保留在緩存中,但一旦被調用就會重新編譯。
ALTER VIEW可應用於索引視圖,但是,ALTER VIEW會無條件地刪除視圖的所有索引。
若要執行 ALTER VIEW,至少需要具有對 OBJECT 的 ALTER 許可權。
使用SSMS資料庫管理工具修改視圖
1、連接資料庫,選擇資料庫,展開資料庫-》展開視圖-》選擇要修改的視圖-》選擇設計。
2、在關係圖窗格中-》修改視圖-》修改完成,點擊保存。
3、使用修改的視圖。
使用T-SQL腳本修改視圖
語法:
--聲明資料庫引用
use 資料庫名;
go
--修改視圖
alter view [架構名][.]視圖名
with encryption,schemabinding,view_metadata
as
select_statement
[check option];
go
語法解析:
schema_name
視圖所屬架構的名稱。
view_name
要更改的視圖。
column
將成為指定視圖的一部分的一個或多個列的名稱(以逗號分隔)。
encryption
適用範圍: SQL Server 2008 到 SQL Server 2017 和 Azure SQL Database。
加密 sys.syscomments 中包含 ALTER VIEW 語句文本的項。 WITH ENCRYPTION 可防止視圖作為 SQL Server 複製的一部分進行發佈。
schemabinding
將視圖綁定到基礎表的架構。 如果指定了 SCHEMABINDING,則不能以可影響視圖定義的方式來修改基表。 必須首先修改或刪除視圖定義本身,然後才能刪除要修改的表的相關性。 使用 SCHEMABINDING 時,select_statement 必須包含所引用的表、視圖或用戶定義函數的兩部分名稱 (schema.object)。 所有被引用對象都必須在同一個資料庫內。
不能刪除參與使用 SCHEMABINDING 子句創建的視圖的表或視圖,除非該視圖已被刪除或更改,而不再具有架構綁定。 否則, 資料庫引擎將引發錯誤。 另外,如果對參與具有架構綁定的視圖的表執行 ALTER TABLE 語句,而這些語句又會影響視圖定義,則這些語句將會失敗。
view_metadata
指定為引用視圖的查詢請求瀏覽模式的元數據時, SQL Server 實例將向 DB-Library、ODBC 和 OLE DB API 返回有關視圖的元數據信息,而不返回基表的元數據信息。 瀏覽模式的元數據是 資料庫引擎實例返回到客戶端 DB-Library、ODBC 和 OLE DB API 的額外元數據。 如果使用此元數據,客戶端 API 將可以實現可更新客戶端游標。 瀏覽模式的元數據包含結果集中的列所屬的基表的相關信息。
對於使用 VIEW_METADATA 創建的視圖,瀏覽模式的元數據在描述結果集內視圖中的列時,將返回視圖名,而不返回基表名。
使用 WITH VIEW_METADATA 創建視圖時,如果該視圖具有 INSERT 或 UPDATE INSTEAD OF 觸發器,則視圖的所有列(timestamp 列除外)都可更新。 有關詳細信息,請參閱 CREATE VIEW (Transact-SQL) 中的“註釋”部分。
as
視圖要執行的操作。
select_statement
定義視圖的 SELECT 語句。
with check option
要求對該視圖執行的所有數據修改語句都必須符合 select_statement 中所設置的條件。
示例:
--聲明資料庫引用
use testss;
go
--修改視圖
alter view dbo.view1
with encryption,schemabinding,view_metadata
as
select a.id,a.name,a.sex,a.height,b.id as classid
from dbo.test1 as a
inner join dbo.test3 as b on a.classid=b.id;
go
使用修改後的視圖