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