1.3 刷新视图
在创建视图时,SQL Server会保存元数据信息用于描述视图、列、安全、依赖等信息。基对象(underlying object)中的构架更改不影响视图的元数据信息。更改架构后,使用sp_refreshview存储过程刷新视图的元数据信息是一个好习惯,这样对架构的更改就可以反映到视图中。
为演示架构更改后不刷新视图的元信息会发生什么事情,运行下面的代码,它将创建表T1和视图V1。
USE tempdb;
GO
IF OBJECT_ID(‘dbo.V1’) IS NOT NULL
DROP VIEW dbo.V1;
GO
IF OBJECT_ID(‘dbo.T1’) IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1(col1 INT, col2 INT);
INSERT INTO dbo.T1(col1, col2) VALUES(1, 2);
GO
CREATE VIEW dbo.V1
AS
SELECT * FROM dbo.T1;
GO
在实践中,要避免在SELECT语句中使用*。我使用它只是为了演示。第一次创建V1时,SQL Server保存关于列的元数据信息,此时的列为col1和col2,如果你查询该视图,你会得到的输出如表5-3所示,它包括两个列。
SELECT * FROM dbo.V1;
表5-3 向T1添加列之前查询V1的输出
|
col1 |
col2 |
|
1 |
2 |
接下来向T1添加一列:
ALTER TABLE dbo.T1 ADD col3 INT;
T1架构的更改并没有反映到视图中的元数据信息。视图还是只包含两列。如果你再次查询视图,你得到的还是表5-3中的输出。
SELECT * FROM dbo.V1;
要刷新视图的元数据信息,对V1运行sp_refreshview存储过程。
EXEC sp_refreshview ‘dbo.V1’;
再次查询V1,你将得到表5-4所示的输出,它包含了新增的列——col3:
SELECT * FROM dbo.V1;
表5-4 刷新元数据后查询V2的输出
|
col1 |
col2 |
Col3 |
|
1 |
2 |
NULL |
这只是一个对基对象的架构更改未影响视图元数据信息的示例。你可能会发现,更改数据库中对象的架构之后刷新所有视图的元数据信息是个好习惯。为避免编写sp_ refreshview语句的繁琐过程,你可以使用下面的查询。
SELECT N’EXEC sp_refreshview ‘
+ QUOTENAME(VIEW_NAME, ‘’’’) + ‘;’ AS cmd
FROM (SELECT QUOTENAME(TABLE_SCHEMA)
+ N’.’ + QUOTENAME(TABLE_NAME) AS VIEW_NAME
FROM INFORMATION_SCHEMA.VIEWS) AS V
WHERE OBJECTPROPERTY(OBJECT_ID(VIEW_NAME), ‘IsSchemaBound’) = 0;
该查询将生成一些代码,这些代码用于对数据库中所有未绑定架构(schema-bound)的视图执行的sp_refreshview语句。
警告
在运行生成的代码之前要仔细检查。一些有创建视图权限的人可能会恶意放置一些很巧妙的视图名称,以此破坏这些维护代码并造成危害。
完成后,删除V1和T1。
USE tempdb;
GO
IF OBJECT_ID(‘dbo.V1’) IS NOT NULL
DROP VIEW dbo.V1;
GO
IF OBJECT_ID(‘dbo.T1’) IS NOT NULL
DROP TABLE dbo.T1;
GO