【问题标题】:ADD and DROP SQL Server table constraint command in one transaction caused error一个事务中的 ADD 和 DROP SQL Server 表约束命令导致错误
【发布时间】:2012-12-15 15:21:41
【问题描述】:

我有更多的 SQL 脚本(每个用于不同版本的应用程序),我想在一个事务中执行所有脚本。

我正在使用 c# 执行它:

ExecuteNonQuery(command, conn, trans) 

SqlCommand.

脚本中的 SQL 命令由GO 分隔符分隔。我的 C# 代码遍历所有脚本并基于 GO 分隔符创建 SqlCommand 的集合。 GO 分隔符被排除在 SqlCommand 执行之外。它只是脚本文件中的分隔符。

一切正常,但我发现了一个问题。我在一个脚本中有以下命令:

ALTER TABLE [dbo].[RoleDataPermissions]  WITH NOCHECK ADD  CONSTRAINT     
[FK_RoleDataPermissions_OrganizationUnits] FOREIGN KEY([OrganizationUnitID])
REFERENCES [OrganizationUnits] ([ID])

在另一个脚本中(在另一个版本的应用程序中,这个约束被删除了)我有:

ALTER TABLE [dbo].[RoleDataPermissions] 
DROP CONSTRAINT FK_RoleDataPermissions_OrganizationUnits

第一个命令正常通过,但第二个命令抛出异常:

'FK_RoleDataPermissions_OrganizationUnits' 不是约束。无法删除约束。查看以前的错误。

我正在尝试找出导致此问题的原因。我认为,问题在于,如果所有命令都在一个事务下执行,那么第一个命令没有提交,然后第二个命令找不到这个约束。我也尝试将隔离级别更改为readuncommited,但这没有帮助。

你知道如何处理这个问题吗?

谢谢

【问题讨论】:

  • 确定你没有在某处埋葬错误?第一个 FK 语法无效,因为它在任何地方都没有 REFERENCES
  • 是的,第一个不起作用,对哪个表 OrganizationUintID 的引用在哪里?
  • 伙计们,对不起,我在以堆栈跟踪形式格式化 sql 时犯了一个错误。你是对的,那里缺少参考。我现在已经更正了。

标签: sql sql-server ado.net transactions


【解决方案1】:

您的分析不正确,因为事务可以看到它自己的未提交数据。这很容易证明如下。

CREATE TABLE T1
  (
     ID INT PRIMARY KEY
  )

CREATE TABLE T2
  (
     ID INT
  )

BEGIN TRAN

ALTER TABLE T2
  WITH NOCHECK ADD CONSTRAINT FK_Test FOREIGN KEY(ID) REFERENCES T1

GO

ALTER TABLE T2
  DROP CONSTRAINT FK_Test

COMMIT

DROP TABLE T1, T2 

您发布的语法无效,但是很可能由于语法错误而没有创建约束,并且由于某种原因,您的应用程序中没有报告异常。或者(如果你的实际语法是正确的)你可能会放弃约束两次。

【讨论】:

  • 感谢 Martin,您的提示帮助了我。我正在通过 sql profiler 监视 sql 命令,我发现确实有两个相同的 sql 命令正在尝试删除约束。可能我的解析器中有一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多