Ich stieß auf das gleiche Problem und verwendete Pre/Post Deployment-Skripte, um Benutzer, Berechtigungen, Rollen, etc. wie den vorgeschlagenen Blog-Post wieder einzufügen. Dies wurde jedoch auf lange Sicht nicht mehr aufrecht erhalten (Benutzer können sich während der Bereitstellung nicht authentifizieren. Wenn die Bereitstellung fehlschlägt, werden Berechtigungen nicht wiederhergestellt, Sicherheitsänderungen erfordern die Quellcodeverwaltung und erneute Bereitstellung).
Kürzlich habe ich das Problem neu bewertet, als wir unsere Bereitstellungsplattform migrierten. Mit der Freigabe DacFx API (und bug fixes) konnte ich den Bereitstellungsprozess in SSDT erweitern, indem ich einen DeploymentPlanModifier erstellte. Sie bieten eine , mit einfachen Modifikationen ich filter alle Tropfen für Erlaubnis basierte Objekttypen (mit /p:AdditionalDeploymentContributors Argument).
[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;
}
}
Wir haben gerade die neue Version ausprobiert und es funktioniert perfekt für uns. Ich kann nicht glauben, dass es so lange gedauert hat, die Optionen hinzuzufügen, aber ich muss jetzt keine Workarounds mehr machen. – Matt