WITH VIEW_METADATA选项对SQL Server中的视图有何作用?

时间:2015-03-31 16:57:17

标签: sql-server tsql views

我正在使用SQL Server 2012。

定义是:

  

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

这是查询:

alter view dbo.sales(vi)
with view_metadata
as
   select o.[SalesOrderID] 
   from [Sales].[SalesOrderHeader] o 

   select * from dbo.sales

返回:

vi
43698
43699
43700
43701

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

有人可以告诉我WITH VIEW_METADATA的含义以及它与其他视图选项的不同之处吗?

2 个答案:

答案 0 :(得分:3)

<强> VIEW_METADATA

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

在某些情况下,例如:

  1. 出于安全原因,您希望隐藏客户端应用程序中的基表名称,或者
  2. 客户端应用程序,因为您将以前的基表重组为数据库中的新结构和组织,并使用相同名称的视图使架构看起来与应用程序相同。但该应用程序正在捕获列的基表名称,这不再正确
  3. 您可以使用VIEW_METADATA选项创建视图。

    VIEW_METADATA会导致SQL Server在描述结果集中的列时返回视图名称,并从客户端应用程序中隐藏基表。

    从SSMS内部进行交互时,您不会看到与VIEW_METADATA或没有VIEW_METADATA的视图有任何差异。

    有关更多讨论,请参阅Practical use of VIEW_METADATA on views?Any? on SQL Central

    <强> SCHEMABINDING

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

    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选项,然后重试:

    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.
    

答案 1 :(得分:2)

使用SCHEMABINDING非常常见,因为它会锁定基础表,不会更改表的结构,因此视图将继续工作。如果没有它,其他开发人员可能会删除视图中用于打破视图的列。

&#39;使用view_metadata&#39; 为客户端提供有关客户端需要根据视图创建游标的视图的元数据。它的使用频率与SCHEMABINDING差不多。 https://technet.microsoft.com/en-us/library/ms187956%28v=sql.110%29.aspx

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