5.3刷新視圖

在建立視圖時,sql server會保存元數據信息,用於描述視圖、列、安全、依賴等信息;基礎對象中的架構更改不影響視圖的元數據;更改架構後使用sp_refreshview存儲過程刷新視圖是一個好習慣,這樣對架構的更改就會反映在視圖中。sql

爲了掩飾架構改變後,不刷新視圖元數據會發生什麼狀況,運行下面的代碼建立表T1和視圖V1數據庫

use tempdb;
go
if OBJECT_ID ('dbo.v1') is not null
    drop view dbo.v1;
if OBJECT_ID('dbo.T1') is not null
    drop table dbo.T1;

create Table T1(col1 int ,col2 int);
insert into T1(col1,col2) values(1,2);

go
create view V1
as 
select * from T1;

第一次建立V1時,sql server保存關於列的元數據信息,此時的列爲Col1和Col2,若是你查詢該視圖,你將獲得以下結果,即它包含兩個列安全

image

接下來,咱們給基礎表T1增長一列Col3架構

alter table dbo.T1 add col3 int;

T1的架構更改並無反應到視圖的元數據中。視圖中仍是包含兩列,若是你再次查詢視圖,依然獲得上圖所示的結果。spa

要刷新視圖的元數據,對V1運行sp_refreshview存儲過程code

exec sp_refreshview 'dbo.V1';

再次執行查詢server

select * from dbo.V1;

將獲得以下結果對象

image

更改數據庫的架構後,刷新全部視圖的元數據信息是個好習慣blog

爲避免編寫sp_refreshview語句的繁瑣過程,能夠使用以下語句:get

select N'Exec sp_refreshview '+QUOTENAME(ViewName,'''')+';' as cmd
from
(select QUOTENAME(TABLE_SCHEMA)+N','+QUOTENAME(TABLE_NAME) as ViewName from INFORMATION_SCHEMA.VIEWS) as V
where OBJECTPROPERTY(OBJECT_ID(ViewName),'IsSchemaBound')=0
相關文章
相關標籤/搜索