首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VIEW_METADATA选项如何处理Server中的视图?

VIEW_METADATA选项如何处理Server中的视图?
EN

Stack Overflow用户
提问于 2015-03-31 16:57:16
回答 2查看 10.2K关注 0票数 6

我正在使用Server 2012。

定义是:

用VIEW_METADATA 指定时,将返回视图的元数据,而不是基表。

这是一个查询:

代码语言:javascript
复制
alter view dbo.sales(vi)
with view_metadata
as
   select o.[SalesOrderID] 
   from [Sales].[SalesOrderHeader] o 

   select * from dbo.sales

返回:

代码语言:javascript
复制
vi
43698
43699
43700
43701

当更改为WITH SCHEMABINDING时,也会生成相同的结果。

有谁能告诉我WITH VIEW_METADATA的含义,以及它与其他视图选项有何不同?

EN

回答 2

Stack Overflow用户

发布于 2018-01-30 04:28:05

VIEW_METADATA

当客户端API(例如: describing、ODBC和ODBC、ORM工具)请求Server对于引用视图的查询的元数据信息(也称为浏览模式元数据)时,SQL server在描述结果集中的列时返回由视图组成的基表名称。

在某些情况下,例如:

  1. 出于安全考虑,您希望对客户端应用程序隐藏基表名,或
  2. 客户端应用程序,因为您将以前的基表重组为DB中的新结构和组织,并且使用了同名视图,使得模式在应用程序中看起来是相同的。但是该应用程序正在捕获列的基表名称,这已不再正确。

您可以使用VIEW_METADATA选项创建视图。

VIEW_METADATA使Server在描述结果集中的列时返回视图名,并向客户端应用程序隐藏基表。

在从SSMS内部进行交互时,您不会看到与VIEW_METADATA视图或不使用VIEW_METADATA视图有任何不同。

有关更多讨论,请参见视图上的元数据?有吗?浅谈SQL Central

SCHEMABINDING

如果使用schemabinding创建视图,则不能以影响视图定义的方式修改基表。必须首先修改或删除视图定义本身,以删除要修改的表上的依赖项。例如:

代码语言:javascript
复制
create table  dbo.SomeTable  (
     c1   int  null,
     c2   int  null
    ) 
go

create view dbo.SomeView with schemabinding 
as
    select c1 from dbo.SomeTable
go

alter table dbo.SomeTable drop column c1
go

--Returns error:
--  Msg 5074, Level 16, State 1, Line 13
--  The object 'SomeView' is dependent on column 'c1'.
--  Msg 4922, Level 16, State 9, Line 13
--  ALTER TABLE DROP COLUMN c1 failed because one or more objects access this column.

现在从视图中删除schemabinding选项并重试:

代码语言:javascript
复制
alter view dbo.SomeView
as
    select c1 from dbo.SomeTable
go

alter table dbo.SomeTable drop column c1
go
-- Works fine, but any further references to the view return errors.

select top 10 * from dbo.SomeView 
--  Msg 207, Level 16, State 1, Procedure SomeView, Line 3 [Batch Start Line 30]
--  Invalid column name 'c1'.
--  Msg 4413, Level 16, State 1, Line 31
--  Could not use view or function 'dbo.SomeView' because of binding errors.
票数 6
EN

Stack Overflow用户

发布于 2015-03-31 18:14:12

与SCHEMABINDING相比,SCHEMABINDING非常常见,因为它锁定了底层表,使其无法更改表的结构,因此视图将继续工作。没有它,其他开发人员可以删除视图中使用的列,从而破坏视图。

'With view_metadata'提供客户端元数据,介绍客户端需要针对视图创建游标的视图。它的使用频率没有SCHEMABINDING那么频繁。https://technet.microsoft.com/en-us/library/ms187956%28v=sql.110%29.aspx

当您在SSMS中进行选择时,这两个参数都不会产生很大影响,您将看到相同的数据和列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29374234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档