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]
微软称之为"走开".
该功能于1992年7月使用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)
小智 5
您可以在运行事务时禁用约束,然后在完成后重新启用约束。
ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint
--... RUN TRANSACTION
ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL
Run Code Online (Sandbox Code Playgroud)
警告:这会影响所有连接。