SSDT TSqlModel.DeleteObjects方法没有按预期运行

时间:2017-01-11 20:57:34

标签: c# sql-server sql-server-data-tools

我一直在尝试使用TSqlModel方法DeleteObjects以编程方式从数据库项目中删除某些用户。问题是,当我调用该方法时,用户仍然在模型中。我想知道我是否正确调用该方法。这就是我正在做的事情:

modelFromDacpac.DeleteObjects(@"DOMAIN\user");

当我运行以下代码以查看它是否真的消失时,用户仍然在那里!

var tst_delete= modelFromDacpac.GetObjects(User.TypeClass, new ObjectIdentifier(@"DOMAIN\user"), DacQueryScopes.Default).FirstOrDefault();

tst_delete为非null,其名称与"DOMAIN\user"匹配。

知道我做错了吗?

2 个答案:

答案 0 :(得分:2)

在DeleteObject方法调用之前,我插入以下行 - 其中sqlobj对象是指向我试图删除的用户的TSqlObject

modelFromDacpac.ConvertToScriptedObject(sqlobj,“DOMAIN_user.sql”); //由于某种原因,登录不是DACPAC中的脚本对象,因此无法使用DeleteObjects方法删除 - 或者可能无法找到它们

我调用DeleteObject方法如下: modelFromDacpac.DeleteObjects( “DOMAIN_user.sql”);

我不确定为什么这可行,但确实如此。我的猜测是,DeleteObject方法非常挑剔它希望如何以及在何处找到对象。或者,某些对象(如用户)可能以某种非标准方式存储,从而阻止DeleteObjects查找它们。无论是什么原因,但显式地将用户转换为具有给定名称的脚本对象,并将该给定名称传递给DeleteObjects方法,它都可以工作。

我有点担心我不知道为什么它有效。另一个问题是它没有出现在TSqlModel对象的官方文档中: https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.model.tsqlmodel_methods(v=sql.120).aspx

但确实有效。至少,到目前为止。

答案 1 :(得分:0)

DeleteObject以同样的方式捕获了我:) - 它只删除了使用AddOrUpdate添加的脚本,当您传入脚本名称并且Delete使用相同的脚本名称时。

您需要做的是创建一个新模型并添加除了您要删除的内容之外的所有内容。

您为什么要删除登录信息?如果您不希望它被部署,您可以使用像我这样的部署贡献者在部署时排除登录:

https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-Deployments