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

Mic*_*Sim 34 sql sql-server transactions constraints

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

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

gbn*_*gbn 30

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

SET DISABLE_DEF_CNST_CHK ON
Run Code Online (Sandbox Code Playgroud)

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

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

有一个Microsoft Connect请求,创建于2006年,要求此功能:

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

存在各种"鸡和鸡蛋"场景,其中期望延迟检查参照完整性约束直到事务上的提交时间.

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

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

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

格雷格你好,

感谢您的反馈.我们已经意识到这一点,并为将来的版本进行调查.

Sameer Verkhedkar
SQL引擎
[MSFT]

微软称之为"走开".

SQL-92定义它

该功能于19927月使用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
Run Code Online (Sandbox Code Playgroud)

  • 完成图片:PostgreSQL也允许延迟约束. (5认同)
  • @DannyEllisJr。自从 SQL Server 2000 28 年前发布以来,它已经不复存在了…… (2认同)

小智 5

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

ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint

--... RUN TRANSACTION

ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,唯一的问题是,如果我的进程崩溃或异常结束,我不能保证约束将重新打开。当服务器看到我的连接丢失时,该事务将被服务器回滚,但不重置约束是一个问题... (3认同)
  • 这不影响所有连接,而不仅影响您自己的连接,因此另一个连接可能会在您的事务进行过程中违反约束,并阻止提交? (2认同)
  • 这是一个危险的建议。虽然您运行的UPDATE可能只需要几秒钟,但是重新启用受影响的约束可能需要几个小时。这样,您就拥有了一个对于OLTP基本上是脱机的数据库(因为-希望-拥有对该表的排他锁)数小时,而此时您只想在两个表中插入五行。 (2认同)