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

Posted

技术标签:

【中文标题】为啥我可以使用 SCHEMABINDING 修改视图引用的表?【英文标题】:Why can I modify a table that is referenced by a view with SCHEMABINDING?为什么我可以使用 SCHEMABINDING 修改视图引用的表? 【发布时间】:2013-10-24 21:07:35 【问题描述】:

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

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

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

注意:我尝试删除基表,但由于 SCHEMABINDING,我无法这样做。

【问题讨论】:

这是mysql还是SQL Server?不同的东西。哦,也许是个愚蠢的问题,但是您删除的列是否包含在视图中? ohhh yesss...该列不在视图中。 嗯,这就是你的答案,正如 Aaron 在下面详细解释的那样。 【参考方案1】:

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

错误:

消息 5074,第 16 级,状态 1,第 17 行 对象“vFoo”依赖于列“a”。 Msg 4922,第 16 层,第 9 州,第 17 行 ALTER TABLE DROP COLUMN a 失败,因为一个或多个对象访问此列。

所以,无论是谁在那个论坛上写了他们写的东西,他们都不是很明确或详尽。 The documentation 更有帮助,但您仍然需要推断:

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

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

【讨论】:

以上是关于为啥我可以使用 SCHEMABINDING 修改视图引用的表?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)

sql 使用SchemaBinding的MS SQL视图

为啥我的 Django REST Framework 视图集 URL 没有解析?

使用 SCHEMABINDING 更改函数,用作具有索引的计算字段的公式

在朴素贝叶斯中的概率估计中的 m 应该被视为啥

如何手动添加或者修改海威康视摄像头IP地址的方法