防止用户在使用SqlPackage.exe发布DACPAC时丢弃
有什么方法可以在使用SqlPackage.exe发布DACPAC时防止用户被删除,而不是更改下面的设置,这样可以防止所有对象被删除,不要在DACPAC中。防止用户在使用SqlPackage.exe发布DACPAC时丢弃
<DropObjectsNotInSource>True</DropObjectsNotInSource>
我们部署了一些环境中,每个用户不同。目前的解决办法,其一是:
- 脚本为每个环境的用户部署
- 使用
/Action:Script
后重新创建它们并手动更改部署脚本。
这些都不是理想的,但...
我们在后期部署脚本处理这个问题。设置起来有点困难,但一旦设置完成,您可以为每个环境配置稍微不同的脚本。我们将这与每个环境使用不同配置文件的“发布配置文件”结合使用。基本上,您可以使用Powershell为用户和权限生成一堆脚本,将这些脚本添加到项目中,然后将这些文件包含在项目中。将博客文章中提到的“SecurityAdditionsWrapper.sql”添加到您的部署后脚本中,您应该很好。只需从项目中删除其他安全性,以确保其设置正确。
http://schottsql.blogspot.com/2013/05/ssdt-setting-different-permissions-per.html
也有在SSDT选项: “落权限不在源” - 假 “在源不能确定删除角色成员” - 假 “忽略权限” - 真正的 “忽略的作用会员制” - 真正的
我们使用的,但如果你的环境需要更好地控制用户/权限,我强烈建议你检查出该博客文章。 (与感谢杰米·汤姆逊原来的想法。)
发现有与此这里的MS连接问题: https://connect.microsoft.com/SQLServer/feedback/details/ 775839/ssdt-add-publication-setting-to-ignore-database-users 虽然,MS在2013年初将其标记为“无法修复”。 – Michael12345
我遇到同样的问题,使用前/后部署脚本重新插入用户,权限,角色等类似建议的博客文章。然而,这成为不可维护的,从长远来看(用户无法在部署过程中进行身份验证,如果部署失败的权限不恢复,安全更改需要通过源控制,并重新部署去)。
最近,我们在迁移我们的部署平台时重新评估了这个问题。通过发布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;
}
}
请问你能解释一下怎么做?我找不到如何安装/设置/不管这个。我发现了一些需要创建的dll,以便将其作为/ p:AdditionalDeploymentContributors参数传递,但是我找不到如何创建此dll –
嗨sidux - 您可以使用为您预先制作的这个dll或用它作为编写你自己的基础:http://agilesqlclub.codeplex.com/(我写它) - 更多细节https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-部署 –
如何使用您自己的?我正在与Ed(Agilesqlclub的作者)进行交流,我们无法正常工作。我正在与VS2012 SSDT合作。主要问题是我不知道VS2012使用的SqlPackage.exe位于哪里。我尝试过搜索,还有很多其他的东西,但仍然没有效果 –
使用SqlPackage。exe文件参数(自2015年2月份发布:New Advanced Publish Options to Specify Object Types to Exclude or Not Drop):
下面是我们在部署中使用的实际参数:
/p:DropObjectsNotInSource=True
/p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions
第一行清除所有,但下一行进一步细化什么不能下降。这种组合证明了我们最有效的方式放弃所有不必要的对象,但仍保留登录映射。
所有的参数及其可能的值的详细文档可以从MSDN - SqlPackage.exe
也可能需要排除:'Credentials; DatabaseScopedCredentials' –
我们刚刚尝试了新版本,它对我们来说非常完美。简直不敢相信花了这么长时间才能添加这些选项,但现在可以节省必须做的任何解决方法。 – Matt