1

より多くのSQLスクリプト(それぞれがアプリケーションのバージョンが異なる)があり、すべてのスクリプトを1つのトランザクションで実行したいと考えています。

私はそれをc#から使用して実行しています:

ExecuteNonQuery(command, conn, trans) 

SqlCommand

スクリプト内のSQLコマンドは、GO区切り文字で区切られています。私のC#コードはすべてのスクリプトを反復処理し、セパレーターにSqlCommand基づいてコレクションを作成します。セパレータは実行から除外されGOます。これは、スクリプトファイルの単なる区切り文字です。GOSqlCommand

すべて正常に機能していましたが、1つの問題が見つかりました。1つのスクリプトに次のコマンドがあります。

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

最初のコマンドは正常に渡されましたが、2番目のコマンドは例外をスローします。

「FK_RoleDataPermissions_OrganizationUnits」は制約ではありません。制約を削除できませんでした。以前のエラーを参照してください。

私はこの問題の原因を突き止めようとしています。問題は、すべてのコマンドが1つのトランザクションで実行される場合、最初のコマンドがコミットされず、2番目のコマンドがこの制約を見つけることができないことだと思います。分離レベルもに変更しようとしまし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 

投稿した構文は無効ですが、構文エラーが原因で制約が作成されていない可能性が高く、何らかの理由でアプリケーションで例外が報告されていません。または(実際の構文が正しい場合)、制約を2回削除している可能性があります。

于 2012-12-15T16:40:09.043 に答える