DacPac排除用户并登录导出或导入

我正在做一些自动化操作,并正在将一些10-15岁的古怪脚本重写为一个简单的单元,这可以:

  • 在生产环境中从MsSql2012导出数据库方案
  • 在开发环境中将数据库方案导入MsSql2012
  • 我使用Microsoft.SqlServer.Dac来完成这项工作,我可以在其中导出/导入dac包。

    它很好地工作:),但是在完成我的所有TDD和测试之后,现在是真正的时间了,事实证明我完全错过了我们的工作中有两个域。

    这意味着当我在开发环境中导入dacpac时会出现错误,因为我们的2个域不具有完全的双向信任,当然数据库也有来自这两个域的用户。 特别是生产域用户。 我可以看到3个可行的解决方案:

  • 获得环境之间的完全信任。 但是由于在我的工作中执行的高度安全性,这不会发生。
  • 无需用户导入dacpac。
  • 无需用户输出到dacpac。
  • 我读过文档(当然是模糊的),试图找到一组可以实现2)或3)的选项。 我测试了很多组合,但没有任何工作。 由于生产用户无法在开发环境中进行验证,因此dac pac导入不断尝试创建用户并失败。

    我使用部署和提取导出/导入。 不同的选项可以在这里找到:

  • 解压缩:http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx
  • 部署:http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacdeployoptions.aspx
  • 没有组合我找到了作品,我甚至读过表明它在DacPac中存在缺陷的帖子。 但我不确定。 我现在正在研究的最后一个选项是使用GenerateScript方法,希望能够强制排除用户/登录,但是我担心它不会起作用。 请参阅(http://technet.microsoft.com/en-us/library/hh753526.aspx)。

    问题:如何从导出或导入中排除我的dacpac中的用户/登录?

    UPDATE

    当前提取设置:

    IgnoreUserLoginMappings = true,
    VerifyExtraction = false,
    

    当前部署设置:

    CreateNewDatabase = true,
    DeployDatabaseInSingleUserMode = true,
    DisableAndReenableDdlTriggers = true,
    IgnoreUserSettingsObjects = true,
    

    更新

    到目前为止,所有事情都指向了一个丑陋的解决方案

    I can generate a deploy script using DacServices. 
    Then i can parse the script (Remove logins etc).
    Then write the result to a file.
    And then call SQLCMD in an external process given it the generated and parsed file. 
    Finally i must evaluate the result from the SQLCMD process.
    

    使用SQLCMD的原因是,生成的脚本显然不是纯粹的tsql,而是使用':setvar',只有SQLCMD可以处理,据我所知。 来吧MS ...

    再次,如果有人知道在C#中执行此操作的更好方法,或者知道DacPac程序集的错误修复/更新,请分享。 :)

    更新

    我发现像IgnorePartitionSchemes这样的东西也不起作用。 看起来,命名空间Microsoft.SqlServer.Dac,不仅仅是一点点,但非常奇怪或缺乏实现。


    我设法通过以下部署dacpac文件来解决此问题。 重要的设置是在ExcludeObjectTypes

    const string connectionString = @"Data Source=(LocalDB)MSSQLLocalDB...";
    var dacServices = new DacServices(connectionString);
    
    // show deployment in the output window.
    dacServices.Message += (o, args) => Debug.WriteLine(args.Message);
    dacServices.ProgressChanged += (o, args) => Debug.WriteLine(args.Status);
    
    // load the file.
    var dacpac = DacPackage.Load("file.dacpac");
    var options = new DacDeployOptions
        {
             IgnorePermissions = true,
             IgnoreUserSettingsObjects = true,
             IgnoreLoginSids = true,
             IgnoreRoleMembership = true,
    
             // THIS IS THE MAGIC SETTING THAT FINALLY WORKED.
             ExcludeObjectTypes = new[] { 
                 ObjectType.Users,
                 ObjectType.Logins,
                 ObjectType.RoleMembership }
        };
    dacServices.Deploy(
        dacpac,
        "MyDbName",
        true,
        options);
    

    在部署过程中,重要的设置是“IgnoreUserSettingsObjects”。 这会忽略用户,用户 - >登录和用户 - >模式的关系。 将其设置为true应该是实现这一目标的主要工作。

    在提取时,您还可以将DacExtractOptions.IgnoreUserLoginMappings设置为true。 在这种情况下,用户 - >登录映射不包括在内,但看起来像在部署时忽略用户更重要。 这确实意味着您需要在部署后运行脚本以确保存在正确的用户。


    我正在努力解决类似的问题。 DACPAC只是一个zip文件夹,其中包含3个XML文件。 我找到了一个dacpac操作工具的源代码,并对其进行了修改,以剥离用户并从DACPAC中注销。

    链接地址: http://www.djcxy.com/p/77577.html

    上一篇: DacPac exclude users and logins on export or import

    下一篇: Implicit Resolution with Contravariance