为啥我可以使用 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(二十六)
为啥我的 Django REST Framework 视图集 URL 没有解析?