背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-39315.html    注册17xie 一起来写书 实现您的出书梦想!

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保存关于列的元数据信息,此时的列为col1col2,如果你查询该视图,你会得到的输出如表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


字数:1761    最后更新:8个月以前 [03-18 15:05]happyskynet 修改
本页编辑者:happyskynet  
[前一页]:1.2 视图中的ORDER B…  [后一页]:1.4 模块化方法
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号