在SQL Server中不利于“ SCHEMABINDING”?

我有一个数据库,其中包含数百个笨拙的命名表(CG001T,GH066L等),并且每个数据库都有其“友好”名称的视图(例如,“客户”视图为“ SELECT * FROM GG120T”) 。 我想在视图中添加“ WITH SCHEMABINDING”,以便可以享受与之相关的一些优势,例如能够为视图建立索引,因为少数视图具有计算列,这些列的计算成本很高。

SCHEMABINDING这些视图是否有缺点? 我发现有些文章隐含了缺点,但从未详细介绍它们。 我知道,一旦视图绑定到架构,就不能在不先删除视图的情况下更改会影响该视图的任何内容(例如,列数据类型或排序规则),那是一个,但除此之外吗? 看来,对视图本身建立索引的能力将远远超过更仔细地计划架构修改的缺点。

10个解决方案
44 votes

除非先删除视图,否则您将无法更改/删除表。

Dan S answered 2019-10-09T15:07:11Z
31 votes

哦,使用SCHEMABINDING绝对有缺点-这些实际上来自SCHEMABINDING,尤其是当与COMPUTED列“锁定”关系并导致一些“琐碎的更改”的损失几乎不可能时。

  1. 创建一个表。
  2. 创建一个SCHEMABOUND UDF。
  3. 创建一个引用UDF的COMPUTED PERSISTED列。
  4. 在所述列上添加一个INDEX。
  5. 尝试更新UDF。

祝一切顺利!

  1. UDF为SCHEMABOUND,因此无法删除或更改。
  2. 无法删除该COLUMN,因为它用于INDEX。
  3. 无法更改列,因为它是已计算的。

好吧,老兄 真..!?! 我的日子刚刚变成了PITA。 (现在,当提供经过修改的架构时,诸如ApexSQL Diff之类的工具可以处理此问题,但问题是我什至无法修改架构!)

请注意,我不反对SCHEMABINDING(在这种情况下,这是UDF所必需的),但是我反对没有一种(可以找到的)“临时禁用” SCHEMABINDING的方法。

user2246674 answered 2019-10-09T15:09:14Z
27 votes

一个都没有。 更安全 我们到处使用它。

gbn answered 2019-10-09T15:06:45Z
4 votes

如果这些表来自第三方应用程序(它们因试图隐藏其表而臭名昭著),则当它尝试更改这些表中的任何一个时,将导致升级失败。

您只需要在更新/升级之前更改没有模式绑定的视图,然后将其放回即可。 就像其他人提到的那样。 只是需要一些计划,纪律等。

JeffO answered 2019-10-09T15:09:54Z
4 votes

缺点是,如果您绑定视图,则只能引用其他绑定到视图的视图。

我知道这一点是因为我试图对一个视图进行架构绑定,并遇到一条错误消息,告诉我它不能被架构绑定,因为它所引用的其他视图之一也没有架构绑定。

这样做的唯一结果是,如果您突然想更新一个架构绑定的视图以引用某些新视图或现有视图,则可能还必须将该新视图或现有视图进行架构绑定。 在这种情况下,您将无法更新视图,并且您最好希望数据库开发人员知道如何使用架构绑定视图。

Triynko answered 2019-10-09T15:10:33Z
2 votes

另一个缺点是,您需要对所有内容都使用模式限定名称:您将获得大量错误消息,如下所示:

无法架构绑定视图“视图”,因为名称“表”对于   模式绑定。 名称必须采用两部分格式,并且对象不能   引用自己。

另外,要“关闭”模式绑定,您需要更改视图,这需要您重新定义视图的select语句。 我认为您不需要重新定义的唯一一件事就是任何赠款。 这使我感到不满意,因为覆盖视图似乎是一种本质上不安全的操作。

有点像添加非null约束迫使您覆盖列的数据类型的方式-讨厌!

您还必须重新定义依赖于要更改的架构绑定对象的任何其他视图或过程……这意味着您可能不得不重新定义(并可能破坏)仅用于添加的大量函数和视图(例如, )对一列的非null约束。

我个人认为这并不是真正的解决方案,最好是有一个像样的过程来自动应用任何数据库更改,因此更改数据库不是噩梦。 这样,当您将更改应用于表时,可以删除所有视图和函数,并从头开始重新创建(无论如何都会对其进行检查),作为该过程的一部分。

JonnyRaa answered 2019-10-09T15:11:42Z
1 votes

这对我来说似乎是一个缺点(#是我的):

Cannot create index on view "###.dbo.###" because it uses a LEFT, RIGHT, or FULL OUTER join, and no OUTER joins are allowed in indexed views. Consider using an INNER join instead.

我有点需要我的左加入。 这个SO问题是相关的。

ZagNut answered 2019-10-09T15:12:16Z
1 votes

使用tSQLt单元测试框架时,您会遇到问题,并且在使用FakeTable方法时将需要变通方法,该方法不允许您伪造链接到具有模式绑定的视图的表。

Marcelo Barbieri answered 2019-10-09T15:12:40Z
1 votes

自SQL Svr 2005以来,所提到的负面影响几乎没有超过最佳实践。它避免了可怕的表假脱机。 对我来说,一个主要的缺点是架构绑定的存储过程,函数,视图不能包含“外部”数据库(例如主数据库),因此您可以将所有出色的实时系统内容扔进垃圾箱,除非您的生产核心 数据库位于master内部。 对我来说,没有sys东西我就无法生活。 当然,并非所有处理都需要无假脱机性能,并且可以在较高的数据类层中同时组合快速和慢速结果。

thetempest answered 2019-10-09T15:13:07Z
0 votes

如果您的工具(ssms等)不能很好地/优雅地处理基础对象上的架构更改失败,则可能会使自己陷入真正的混乱。 这就是我现在所坐的地方,而且我确实意识到这是一个边缘情况

Adriaan Davel answered 2019-10-09T15:13:32Z
translate from https://stackoverflow.com:/questions/1659320/downsides-to-with-schemabinding-in-sql-server