我遇到同樣的問題,使用前/後部署腳本重新插入用戶,權限,角色等類似建議的博客文章。然而,這成爲不可維護的,從長遠來看(用戶無法在部署過程中進行身份驗證,如果部署失敗的權限不恢復,安全更改需要通過源控制,並重新部署去)。
最近,我們在遷移我們的部署平臺時重新評估了這個問題。通過發佈DacFx API(和bug fixes),我可以通過創建DeploymentPlanModifier來擴展SSDT中的部署過程。它們提供了一個example for filtering objects on creation,用簡單的修改I濾波器用於基於權限對象類型的任何滴(使用/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;
}
}
我們剛剛嘗試了新版本,它對我們來說非常完美。簡直不敢相信花了這麼長時間才能添加這些選項,但現在可以節省必須做的任何解決方法。 – Matt