4

私は定期的に EF 移行を使用して、データベースをゼロから展開する場合と進化させる場合の両方を展開しています。しかし、私は現在、DACPAC を使用する別のチーム プロジェクトに取り組んでおり、今日まで同様に優れているように見えました。今日、一意のキー制約が不足しているテーブルに一意のキー制約を追加したところ、ご想像のとおり、爆発し、sqlpackage.exe を介した DACPAC の展開が失敗しました。

私が今気付いたのは、障害が決してロールバックされていないことです。したがって、部分的に変換された状態のデータベースがあり、展開前スクリプトが実行された後に削除された列を参照する展開前スクリプトがあるためです。最初は、その理由で失敗したため、dacpac を再度実行できない状態になりました。

私は、間違って、sqlpackage.exe が配置をトランザクションにラップし、失敗するとロールバックすると思い込んでいました。それから、自分の誤りに気づいたとき、また間違って、どこかでフラグを見逃したのだと思いました。

データベースを本質的に破損することなく安全に実行する方法を誰か教えてもらえますか...

4

2 に答える 2

6

/p:IncludeTransactionalScripts=true を使用すると、SqlPackage.exe でメイン スキーマの変更操作を 1 つのトランザクションとして実行できます。ただし、デプロイ前およびデプロイ後のスクリプトは、そのトランザクション ロジックに含まれていないことに注意してください。推奨される方法は、デプロイ前およびデプロイ後のスクリプトを安全に再実行できるように (つまり、べき等 T-SQL として) 作成することです。

于 2016-09-26T22:42:06.293 に答える
1

スティーブンが書いたものに加えて、失敗した場合にスクリプトをロールバックする事前および事後展開スクリプトにラッパーを配置したことに加えて、同じ問題に遭遇します: (さらなる検証/テストのために IF EXISTS 部分のコメントを外すことができます)

SET IMPLICIT_TRANSACTIONS ON    --By default it is OFF

BEGIN TRY
    /*
    IF (EXISTS (SELECT * 
                     FROM INFORMATION_SCHEMA.TABLES 
                     WHERE TABLE_SCHEMA = 'DW' 
                     AND  TABLE_NAME = 'TBL_Users'))
    BEGIN
    */
        DROP TABLE DW.TBL_Users
        DROP TABLE DW.NOT_EXIST_TABLE
    --END
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION;
    DECLARE @ERROR_MESSAGE  VARCHAR(2000);
    SET @ERROR_MESSAGE = CONCAT('Pre deployment script failed failed. ', ERROR_MESSAGE());
    THROW 51000, @ERROR_MESSAGE, 1
END CATCH

COMMIT TRANSACTION;
SET IMPLICIT_TRANSACTIONS OFF --Set back to OFF default
于 2018-05-23T06:25:10.327 に答える