Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个事务中添加和删除SQL Server表约束命令导致错误_Sql_Sql Server_Ado.net_Transactions - Fatal编程技术网

在一个事务中添加和删除SQL Server表约束命令导致错误

在一个事务中添加和删除SQL Server表约束命令导致错误,sql,sql-server,ado.net,transactions,Sql,Sql Server,Ado.net,Transactions,我有更多的SQL脚本(每个脚本用于不同版本的应用程序),我希望在一个事务中执行所有脚本 我正在从c#执行它,使用: 在SqlCommand上 脚本中的SQL命令由GO分隔符分隔。我的C#代码遍历所有脚本,并基于GO分隔符创建SqlCommand的集合。GO分隔符被排除在SqlCommand执行之外。它只是脚本文件中的一个分隔符 一切正常,但我发现了一个问题。我在一个脚本中有以下命令: ALTER TABLE [dbo].[RoleDataPermissions] WITH NOCHECK AD

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

我正在从c#执行它,使用:

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])
在另一个脚本(在另一个版本的应用程序中,此约束已被删除)中,我有:

第一个命令顺利通过,但第二个命令引发异常:

“FK_RoledTaperMissions_OrganizationUnits”不是约束条件。无法删除约束。请参阅前面的错误

我正在试图找出是什么导致了这个问题。我认为,问题是,如果所有命令都在一个事务下执行,那么第一个命令没有提交,第二个命令就找不到这个约束。我还尝试将隔离级别更改为
readuncommitted
,但没有任何帮助

你知道怎么处理这件事吗


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

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 

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

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

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 

您发布的语法无效,但很可能由于语法错误而未创建约束,并且由于某些原因,应用程序中未报告异常。或者(如果您的实际语法正确的话)可能两次删除了约束。

确定您没有将错误隐藏在某个地方吗?第一个FK语法无效,因为它没有
引用
。是的,第一个FK不起作用,对表OrganizationUintID所在位置的引用在哪里?伙计们,对不起,我在stacktrace表单中格式化sql时出错了。你说得对,参考资料不见了。我现在已经更正了。你确定没有把错误埋在什么地方吗?第一个FK语法无效,因为它没有
引用
。是的,第一个FK不起作用,对表OrganizationUintID所在位置的引用在哪里?伙计们,对不起,我在stacktrace表单中格式化sql时出错了。你说得对,参考资料不见了。谢谢马丁,你的提示帮助了我。我用sql profiler监视sql命令,发现实际上有两个相同的sql命令试图删除约束。可能我的解析器中有一个bug。谢谢Martin,你的提示帮助了我。我用sql profiler监视sql命令,发现实际上有两个相同的sql命令试图删除约束。可能我的解析器中有一个bug。
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