SSDT TSqlModel.DeleteObjects 方法未按预期运行

SSDT TSqlModel.DeleteObjects method doesn't behave as expected

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

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

当我运行下面的代码看是不是真的没了,用户还在!

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

tst_delete 是非空的并且有一个匹配 "DOMAIN\user".

的名称

知道我做错了什么吗?

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

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

为什么要删除登录?如果你不想部署它,你可以使用像我这样的部署贡献者来排除部署时的登录:

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

埃德

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

//For some reason, the logins aren't scripted objects within the DACPAC, and so cannot be deleted using the DeleteObjects method - or maybe they simply cannot be found.
modelFromDacpac.ConvertToScriptedObject(sqlobj, "DOMAIN_user.sql");

然后我调用DeleteObject方法如下:

modelFromDacpac.DeleteObjects("DOMAIN_user.sql");

我不确定为什么这行得通,但确实如此。我的猜测是 DeleteObject 方法对于它希望如何以及在何处查找对象非常挑剔。或者,也许某些对象(例如用户)以某种 non-standard 方式存储,从而阻止 DeleteObjects 找到它们。不管是什么原因,只要明确地将用户转换为具有给定名称的脚本对象,并将该给定名称传递给 DeleteObjects 方法,它就可以工作。

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

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