20

以下の設定を変更する以外に、SqlPackage.exe を使用して DACPAC を公開するときにユーザーがドロップされないようにする方法はありますか?

<DropObjectsNotInSource>True</DropObjectsNotInSource>

それぞれ異なるユーザーがいる多数の環境にデプロイします。現在の回避策は次のいずれかです。

  1. 各環境のユーザーのスクリプトを作成して、展開後にそれらを再作成します
  2. 展開スクリプトを使用/Action:Scriptして手動で変更します。

どちらも理想的ではありませんが...

4

3 に答える 3

3

私は同じ問題に遭遇し、提案されたブログ投稿のように、導入前後のスクリプトを使用してユーザー、権限、役割などを再挿入しました。ただし、これは長期的には維持できなくなりました (ユーザーは展開中に認証できず、展開が失敗した場合はアクセス許可が復元されず、セキュリティの変更にはソース管理と再展開が必要になります)。

最近、展開プラットフォームを移行する際に、この問題を再評価しました。DacFx API (およびバグ修正) がリリースされたため、DeploymentPlanModifier を作成することで SSDT のデプロイ プロセスを拡張することができました。これらは、作成時にオブジェクトをフィルター処理する例を示しています。簡単な変更を加えて、許可ベースのオブジェクト タイプのドロップをフィルター処理します ( /p:AdditionalDeploymentContributors引数を使用)。

[ExportDeploymentPlanModifier( UserMappingFilter.PlanFiltererContributorId, "1.0.0.0" )]
public class UserMappingFilter : DeploymentPlanModifier
{
    public const string PlanFiltererContributorId = "Dac.UserMappingFilter";

    protected override void OnExecute( DeploymentPlanContributorContext context )
    {
        DeploymentStep next = context.PlanHandle.Head;
        while( next != null )
        {
            DeploymentStep current = next;
            next = current.Next;

            DropElementStep dropStep = current as DropElementStep;
            if( dropStep != null && ShouldFilter( dropStep ) )
            {
                base.Remove( context.PlanHandle, dropStep );
            }
        }
    }

    private bool ShouldFilter( DropElementStep createStep )
    {
        TSqlObject target = createStep.TargetElement;


        if( target.ObjectType.Name == "RoleMembership" || target.ObjectType.Name == "User" || target.ObjectType.Name == "Role" )
        {
            return true;
        }


        return false;
    }
}
于 2015-01-01T22:31:47.120 に答える