我有一个数据库,在这数百个笨拙命名表(CG001T,GH066L等),以及我对每一个与它的“友好”的名义发表意见(视野中的“客户”是“SELECT * FROM GG120T”,例如) 。 我想添加“WITH SCHEMABINDING”我的意见,这样我可以有一些与之相关的,如能够索引视图的优点,因为各种观点的屈指可数计算是计算在飞行昂贵列。
是否有不利的一面SCHEMABINDING这些观点? 我发现一些文章,隐约暗示的缺点,但从来没有进入他们的细节。 我知道,一旦一个视图架构绑定,你不能改变任何会不先下探的观点影响视图(例如,列数据类型或归类),所以这是一个,但除了? 看来,有能力索引视图本身将远远超过更仔细地规划你的架构修改的缺点。
哦, 肯定有缺点使用SCHEMABINDING -这些来自事实SCHEMABINDING,尤其是当加上计算列“锁定”的关系 ,使得几乎不可能该死的一些“琐碎的变化”。
- 创建一个表。
- 创建一个架构绑定UDF。
- 创建一个计算PERSISTED列引用UDF。
- 添加在所述列的索引。
- 尝试更新的UDF。
祝一切顺利!
- 该UDF不能删除或修改,因为它是架构绑定。
- 因为它是在索引使用的列不能被丢弃。
- 因为它是计算的列不能被改变。
那么,FRAK。 真..!?! 我的天刚刚成为PITA。 (现在,像ApexSQL DIFF工具时提供了一个修改过的模式 ,但问题是在这里,我甚至不能修改,开始与架构可以处理这个!)
我不反对SCHEMABINDING,头脑(和它需要在这种情况下,UDF),但我反对有没有一种存在方式(即我能找到),以“暂时禁用”的SCHEMABINDING。
如果这些表是从第三方应用程序(它们是臭名昭著的努力隐藏自己的表),你的事业和升级,如果它试图改变任何这些表的失败。
你只需要改变更新之前没有架构绑定的意见/升级,然后把它们放回去。 像其他人所说的。 只是需要一些规划,纪律等。
一个缺点是,如果你schemabind视图,它只能引用其他架构绑定的意见。
我知道这是因为我试图schemabind视图,并会见了一个错误信息,告诉我它无法架构绑定,因为它引用其他视图一个是不是也架构绑定。
这样做的唯一的后果是,如果你突然要更新架构绑定视图引用一些新的或现有的视图,你可能需要schemabind新的或现有的视图中。 在这种情况下,您将无法更新视图,你最好希望你的数据库开发人员知道如何与架构绑定视图的工作。
另一个缺点是,你需要使用的模式限定名的一切:你会得到这样的错误消息的负载:
因为名称“表”是架构绑定无效不能绑定架构视图“视图”。 名称必须是两部分的格式和一个对象不能引用自身。
也为“关闭” SCHEMABINDING你改变看法,这就需要你重新定义视图的select语句。 我想你没有重新定义的唯一事情是任何补助。 这使我从很多的覆盖观点好像一个固有的不安全操作。
它有点像的方式将不空约束迫使你覆盖列的数据类型 - 可恶!
您还可以重新定义取决于你想改变架构绑定对象上的任何其他视图或过程......这意味着你可能必须重新定义(也可能打破)大瀑布的功能和看法只是为了增加(如)NOT NULL约束到一列。
我个人认为,这并不真正代表一个解决方案,它能够更好地有一个体面的过程,借此所以它不是一个噩梦改变数据库的任何数据库的更改都会自动应用。 这样,你可以有你的看法+功能下降,并从头开始(他们得到检查了创建反正)重新创建过程的一部分,当您将更改应用于表。
这似乎是一个缺点,我(#的是我的):
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.
我还挺需要我的左连接。 这太问题是相关的。
当使用tSQLt单元测试框架,你会遇到的问题,并使用FakeTable方法,它不会让你链接到与架构绑定视图假表时将需要的解决方法。
几乎没有提及弊大于利,因为SQL SVR的2005年它避免了可怕的表后台打印此最佳实践。 我的一个主要缺点是,绑定到架构的存储过程,funcs中,视图不能包括“外来的”数据库如主数据库,所以你可以扔掉所有伟大的实时系统的东西在垃圾桶里,除非,例如,你生产的核心数据库坐镇内线高手。 对我来说,我不能生活无着SYS的东西处理。 当然不是所有的处理需要自由卷轴性能和快速和慢速结果可以同时在较高的数据类的层相结合。
如果您的工具(SSMS等)不会在基础对象处理模式更改失败以及/优雅的你可能会导致自己的一些真实的混乱。 这就是我坐在一起,现在,我也知道这是一个边缘的情况下