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

Har*_*hna 4 t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

返回值:

vi
43698
43699
43700
43701
Run Code Online (Sandbox Code Playgroud)

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

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

Hap*_*own 5

VIEW_METADATA

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

在某些情况下,例如:

  1. 出于安全原因,您想从客户端应用程序中隐藏基表名称,或者
  2. 客户端应用程序是因为您在数据库中将以前的基本表重组为新的结构和组织,并使用了相同名称的视图使模式对应用程序看起来相同。但是应用程序正在捕获列的基表名称,这不再正确

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

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

从SSMS进行交互时,VIEW_METADATA无论有无视图,您都不会看到任何差异VIEW_METADATA

看到VIEW_METADATA在视图上的实际使用吗?在SQL Central上进行更多讨论

模式绑定

如果使用创建视图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.
Run Code Online (Sandbox Code Playgroud)

现在,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.
Run Code Online (Sandbox Code Playgroud)


ben*_*its 2

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

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

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