SQL Server是否允许事务中的约束冲突,只要它是';他还没有承诺吗?

SQL Server是否允许事务中的约束冲突,只要它是';他还没有承诺吗?,sql,sql-server,transactions,constraints,Sql,Sql Server,Transactions,Constraints,只要事务尚未提交,SQL Server是否允许事务中的约束冲突(即延迟约束)? 我有一个正在运行的未提交事务,在该事务运行时,我将更改数据,使其违反某些约束(例如,具有重复的主键)。当我提交事务时,数据将处于一致、有效的状态。在SQL中,特别是在MS SQL Server中,通常允许这样做吗?不,对不起。SQL Server不允许事务中存在延迟约束。它出现在SQL Server 6.5中,但在SQL Server 2000中被删除: SET DISABLE_DEF_CNST_CHK ON 无论

只要事务尚未提交,SQL Server是否允许事务中的约束冲突(即延迟约束)?


我有一个正在运行的未提交事务,在该事务运行时,我将更改数据,使其违反某些约束(例如,具有重复的主键)。当我提交事务时,数据将处于一致、有效的状态。在SQL中,特别是在MS SQL Server中,通常允许这样做吗?

不,对不起。SQL Server不允许事务中存在延迟约束。它出现在SQL Server 6.5中,但在SQL Server 2000中被删除:

SET DISABLE_DEF_CNST_CHK ON
无论是否在交易中,每个单独的语句都必须是一致的等

一些RDBMS确实允许这样做(例如Oracle、Postgres、Interbase)

连接 2006年创建的一个应用程序要求提供此功能:

将外键约束检查推迟到事务提交的选项 有各种各样的“鸡和蛋”场景,需要将引用完整性约束的检查推迟到事务的提交时间

允许将引用完整性约束检查延迟到事务的提交时间(作为选项)。建议在BeginTransaction上提供一个选项来指定这一点

微软的最后一次回应是在十年前:

Sameer[MSFT]于2006年10月13日下午1:35发布

你好,格雷格

谢谢你的反馈。我们已经意识到这一点,并在未来的版本中对其进行研究

Sameer Verkhedkar
SQL引擎
[MSFT]

这就是微软所说的“走开”

SQL-92定义了它 该功能已在中定义。示例语法为:

BEGIN TRANSACTION
   SET CONSTRAINTS ALL DEFERRED --applies only to the current transaction

   INSERT Customers ...
   INSERT Orders ...
   UPDATE Customers ... --add the thing we were missing

COMMIT TRANSACTION

您可以在运行事务时禁用约束,然后在完成后重新启用它们

ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint

--... RUN TRANSACTION

ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL

警告:这将影响所有连接。

如果必须(例如从导入文件中清除数据的过程),然后,将中间数据放入临时表、表变量或临时表中,然后在清理并更正数据后,仅对具有约束的实际表执行操作。

SQL Server没有延迟约束选项。但在某些情况下,您可以使用支持忽略约束的大容量插入,而不会出现禁用问题。有关更多信息,请参见以下链接:


然后,在提交事务之前,您必须手动检查整个表上的约束。

要完成这张图片:PostgreSQL也允许延迟约束。Interbase也允许此。。。然而,在这个主题上,对于MSSQL Server,我在FK检查随机同步功能/特性(通过自定义API定期传输一些表更改)方面也有相同的问题。。。最后得到了一个列表,列出了要插入/更新/删除的表的优先级,这样我就有了正确的顺序。我不清楚这个答案。“设置DISABLE_DEF_CNST_CHK ON”是否为您提供了所需的行为?如果是这样,你怎么能通过C#calls运行这样的命令?@DannyEllisJr。自28年前发布SQL Server 2000以来,它已不复存在……这不会影响所有连接,而不仅仅是您自己的连接,因此,当您的事务正在运行时,另一个连接可能会违反约束,并阻止发生提交?是的。您还可以锁定整个表以防止发生这种情况。但是,唯一的问题是,如果我的进程崩溃或异常结束,我不能保证约束将重新打开。当服务器发现我的连接丢失时,事务将被回滚,但不重置约束是一个问题……这不是唯一的问题:如果同时另一个事务提交了不一致的修改,您也会遇到麻烦。我还建议性能可能很差。这是一个危险的建议。虽然您正在运行的更新可能只需要几秒钟,但再次启用受影响的约束可能需要数小时。因此,您有一个基本上处于OLTP脱机状态的数据库(因为您--希望--持有该表的独占锁)数小时,当你只想在两个表中插入五行时,我投了反对票,因为你的建议只适用于
CHECK
约束,而不是
FOREIGN KEY
约束,这才是真正令人头痛的地方(例如,1:1关系、自引用表、循环图数据库、多态表、表中的子类等)。