为什么我可以使用SCHEMABINDING修改视图引用的表?

时间:2013-10-24 21:07:36

标签: mysql sql sql-server

寻找有关SCHEMABINDING的一些说明。我在一个论坛中读到,如果使用Schemabinding创建视图,则无法更改基表。

所以我使用SCHEMABINDING创建了一个视图,并且能够从基表中删除一列。

所以,现在我对SCHEMABINDING的目的是什么以及何时何地应该使用感到困惑?

注意:我试图删除基表,因为SCHEMABINDING而无法这样做。

1 个答案:

答案 0 :(得分:6)

SCHEMABINDING不仅限于对象级绑定。在这种情况下,实际上只能绑定到特定列。拿这个非常简单的例子来说:

CREATE TABLE dbo.foo(a INT, b INT);
GO

CREATE VIEW dbo.vFoo 
WITH SCHEMABINDING 
AS
  SELECT a FROM dbo.foo;
GO

由于视图仅引用了列a,因此我可以删除b没问题:

ALTER TABLE dbo.foo DROP COLUMN b;
GO

但是一旦我尝试触摸a,问题:

ALTER TABLE dbo.foo DROP COLUMN a;
GO

错误:

  

Msg 5074,Level 16,State 1,Line 17   
对象'vFoo'依赖于列'a'。   
消息4922,第16级,第9行,第17行   
ALTER TABLE DROP COLUMN失败,因为一个或多个对象访问此列。

所以,无论谁写了他们在那个论坛上写的东西,他们都不是非常明确或精心制作。 The documentation稍微有点帮助,但您仍需要推断:

  

...不能以影响视图定义的方式修改基表。

请注意,在“修改”一词后,句子不会结束。删除未在视图中引用的列不会以影响视图定义的方式修改表,因为它不知道它不引用的列。