SQL Server是否允许在事务中约束违规,只要它尚未提交?

时间:2011-05-12 07:31:32

标签: sql sql-server transactions constraints

只要事务尚未提交,SQL Server是否允许约束违规(即延迟约束)?

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

4 个答案:

答案 0 :(得分:29)

不,抱歉。 SQL Server不允许在事务中使用延迟约束。它存在于SQL Server 6.5中,但在SQL Server 2000中删除:

SET DISABLE_DEF_CNST_CHK ON

每个单独的陈述必须一致等,无论它是否在交易中

有些RDBMS允许这样做(例如Oracle,Postgres,Interbase)

连接

2006年创建了Microsoft Connect request,要求使用此功能:

  

在事务提交之前推迟外键约束检查的选项

     

有各种“鸡和鸡蛋”场景,我们希望在事务提交时间之前推迟检查参照完整性约束。

     

允许延迟参照完整性约束检查,直到事务的提交时间为止(作为选项)。建议在BEGIN TRANSACTION上提供一个指定此选项的选项。

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

  

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

     

你好格雷格,

     

感谢您的反馈。我们已经意识到这一点,并在未来发布中进行调查。

     

Sameer Verkhedkar
  SQL引擎
  [MSFT]

微软代表“离开”

SQL-92定义它

该功能在July 1992 with 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

答案 1 :(得分:4)

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

ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint

--... RUN TRANSACTION

ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL

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

答案 2 :(得分:0)

如果必须(例如清理导入文件中的数据的进程),则将中间数据放入临时表或表变量或登台表中,然后仅在具有约束的实际表中执行操作清理它并使数据正确。

答案 3 :(得分:0)

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

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