SQL Server中的可延迟约束

LBu*_*kin 33 sql database sql-server oracle constraints

任何版本的SQL Server都支持可延迟约束(DC)吗?

从版本8.0开始,Oracle支持可延迟约束 - 仅在提交语句组时评估的约束,而不是在插入或更新单个表时.可延迟约束不仅仅是禁用/启用约束,因为约束仍处于活动状态 - 它们仅在稍后(批处理提交时)进行评估.

DC的好处是它们允许评估单独非法的更新,这些更新累积地导致有效的最终状态.一个示例是在两行之间的表中创建循环引用,其中每行需要存在一个值.没有单独的插入语句会通过约束 - 但组可以.

为了阐明我的目标,我希望将C#中的ORM实现移植到SQLServer - 遗憾的是,实现依赖于Oracle DC来避免在行之间计算插入/更新/删除命令.

Mir*_*emm 23

OT:有一些恕我直言,SQL Server不支持,但在企业环境中有意义:

  • 这里提到的可延迟约束
  • MARS:为什么你需要设置一个完全自然的选项?
  • CASCADE DELETE约束:SQL Server仅允许给定CASCADE DELETE约束的单个级联路径.同样,我没有看到为什么不应该允许它通过多个可能的路径级联删除的原因:最后,当它真正执行时,实际上总是只有一条路径被使用,所以为什么这是限制吗?
  • 防止单个ADO.NET连接上的并行事务.
  • 强制在具有事务的连接上执行的每个命令都在此事务中执行.
  • 创建UNIQUE索引时,NULL被视为实际值,并且只允许在索引中出现一次.但是,SQL将NULL作为"未知值"的概念表明,在创建索引时,将忽略NULL值...

所有这些小东西都会使您在SQL Server中几乎无用的全尺寸RDBMS所具有的许多参照完整性和事务性功能.例如,由于不支持可延迟约束,因此"事务"作为外部一致工作单元的概念被部分否定,唯一可行的解​​决方案 - 除了一些肮脏的解决方法 - 根本就没有定义参照完整性约束.我希望,事务的自然行为是你可以按照你喜欢的操作方式和顺序在其中工作,系统将确保它在你提交它时是一致的.限制产生了类似的问题,即ON DELETE CASCADE的参照完整性约束只能以只有一个约束可以导致对象的级联删除的方式定义.这真的不适合大多数现实世界的场景.

  • 现在,您可以使用筛选索引包含包含空值的唯一索引. (2认同)

A-K*_*A-K 11

到目前为止,SQL Server不支持它们.你解决的问题是什么?

  • 不久前我写了一篇关于它的小帖子.基本上,您在所有表中保存草稿行,而不是将它们标记为已完成,此时RI将打开.谷歌"模仿可持续计算列的可延迟约束". (2认同)