除了更改下面的设置以防止未包含在 DACPAC 中的所有对象被删除之外,是否有其他方法可以防止在使用 SqlPackage.exe 发布 DACPAC 时丢失用户?
<DropObjectsNotInSource>True</DropObjectsNotInSource>
我们会部署到多个环境,每个环境都有不同的用户。目前的解决方法要么是:
- 为每个环境编写用户脚本,在部署后重新创建用户
- 使用
/Action:Script
并手动更改部署脚本。
但是这些都不是理想的解决方法...
除了更改下面的设置以防止未包含在 DACPAC 中的所有对象被删除之外,是否有其他方法可以防止在使用 SqlPackage.exe 发布 DACPAC 时丢失用户?
<DropObjectsNotInSource>True</DropObjectsNotInSource>
我们会部署到多个环境,每个环境都有不同的用户。目前的解决方法要么是:
/Action:Script
并手动更改部署脚本。但是这些都不是理想的解决方法...
使用 SqlPackage.exe 参数(自2015年2月发布以来:新的高级发布选项,用于指定要排除或不删除的对象类型):
以下是我们在部署中实际使用的参数:
/p:DropObjectsNotInSource=True
/p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions
第一行清理所有内容,但是下一行进一步细化了不应该删除的内容。对我们来说,这种组合证明了最有效的方法,可以删除所有不必要的对象,同时保留登录映射。
有关所有参数及其可能值的详细文档,请参阅MSDN - SqlPackage.exe
[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;
}
}
http://schottsql.blogspot.com/2013/05/ssdt-setting-different-permissions-per.html
SSDT 中还有以下选项: “删除源中不存在的权限” - False “删除没有在源中定义的角色成员” - False “忽略权限” - True “忽略角色成员” - True 我们使用这些选项,但是如果您需要更好地控制您的用户/权限以适应不同的环境,我强烈建议查看该博客文章。(特别感谢 Jamie Thomson 提出的原始想法。)
Credentials;DatabaseScopedCredentials
。 - Jacob Foshee/p:ExcludeObjectTypes="Users;Logins;RoleMembership;Permissions"
。 - TabsNotSpaces