DacPac排除用户并登录导出或导入
我正在做一些自动化操作,并正在将一些10-15岁的古怪脚本重写为一个简单的单元,这可以:
我使用Microsoft.SqlServer.Dac来完成这项工作,我可以在其中导出/导入dac包。
它很好地工作:),但是在完成我的所有TDD和测试之后,现在是真正的时间了,事实证明我完全错过了我们的工作中有两个域。
这意味着当我在开发环境中导入dacpac时会出现错误,因为我们的2个域不具有完全的双向信任,当然数据库也有来自这两个域的用户。 特别是生产域用户。 我可以看到3个可行的解决方案:
我读过文档(当然是模糊的),试图找到一组可以实现2)或3)的选项。 我测试了很多组合,但没有任何工作。 由于生产用户无法在开发环境中进行验证,因此dac pac导入不断尝试创建用户并失败。
我使用部署和提取导出/导入。 不同的选项可以在这里找到:
没有组合我找到了作品,我甚至读过表明它在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