不能除去参与到用架构绑定子句创建的视图中的视图或表,除非该视图已被除去或更改而不再具有架构绑定。否则,SQL Server 会产生错误。另外,对于参与具有架构绑定的视图的表,如果其上的 ALTER TABLE 语句影响了该视图的定义,则这些语句将会失败。
VIEW_METADATA
在为引用视图的查询请求浏览模式元数据时,指定 SQL Server 将向 DBLIB、ODBC 和 OLE DB API 返回有关视图的元数据信息,而不是返回基表或表。浏览模式元数据是由 SQL Server 向客户端 DB-LIB、ODBC 和 OLE DB API 返回的附加元数据,它允许客户端 API 实现可更新的客户端游标。浏览模式元数据包含有关结果集内的列所属基表的信息。
说明 如果原来的视图定义是用 WITH ENCRYPTION 或 CHECK OPTION 创建的,那么只有在 ALTER VIEW 中也包含这些选项时,这些选项才有效。
如果使用 ALTER VIEW 更改当前正在使用的视图,Microsoft® SQL Server™ 将在该视图上放一个排它架构锁。当锁已授予,并且该视图没有活动用户时,SQL Server 将从过程缓存中删除该视图的所有复本。引用该视图的现有计划将继续保留在缓存中,但当唤醒调用时将重新编译。
ALTER VIEW 可应用于索引视图。然而,ALTER VIEW 将无条件地除去视图上的所有索引。
权限
ALTER VIEW 的权限默认地授予 db_owner 和 db_ddladmin 固定数据库角色的成员,以及视图所有者。这些权限是不可传递的。
若要更改视图,用户必须具有 ALTER VIEW 权限,并且对视图中引用的表、视图和表值函数具有 SELECT 权限,对视图中调用的标量值函数具有 EXECUTE 权限。
此外,用户若要更改视图 WITH SCHEMABINDING,则必须对每一个引用的表、视图和用户定义函数具有 REFERENCES 权限。
示例
A. 更改视图
下例创建称为 All_authors 的视图,该视图包含全部的作者。权限授予了视图,但需求改为从犹他州选择作者。于是,使用 ALTER VIEW 替换了该视图。
-- Create a view from the authors table that contains all authors.
CREATE VIEW All_authors (au_fname, au_lname, address, city, zip)
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
GO
-- Grant SELECT permissions on the view to public.
GRANT SELECT ON All_authors TO public
GO
-- The view needs to be changed to include all authors
-- from Utah.
-- If ALTER VIEW is not used but instead the view is dropped and
-- re-created, the above GRANT statement and any other statements
-- dealing with permissions that pertain to this view
-- must be re-entered.
ALTER VIEW All_authors (au_fname, au_lname, address, city, zip)
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
WHERE state = 'UT'
GO
B. 在视图中使用 @@ROWCOUNT 函数
下例使用 @@ROWCOUNT 函数作为视图定义的一部分。
USE pubs
GO
CREATE VIEW yourview
AS
SELECT title_id, title, mycount = @@ROWCOUNT, ytd_sales
FROM titles
GO
SELECT *
FROM yourview
GO
-- Here, the view is altered.
USE pubs
GO
ALTER VIEW yourview
AS
SELECT title, mycount = @@ ROWCOUNT, ytd_sales
FROM titles
WHERE type = 'mod_cook'
GO
SELECT *
FROM yourview
GO