1

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

我正在使用 c# 执行它:

ExecuteNonQuery(command, conn, trans) 

SqlCommand

脚本中的 SQL 命令由GO分隔符分隔。我的 C# 代码遍历所有脚本并SqlCommand基于GO分隔符创建集合。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,但它没有帮助。

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

谢谢

4

1 回答 1

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 

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

于 2012-12-15T16:40:09.043 回答