我一直在尝试使用 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”
匹配。
知道我做错了什么吗?
最佳答案
在 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
方法对于如何以及在何处查找对象非常挑剔。或者,也许某些对象(例如用户)以某种非标准方式存储,这会阻止 DeleteObjects
找到它们。不管是什么原因,只要显式地将用户转换为具有给定名称的脚本对象,并将该给定名称传递给 DeleteObjects
方法,它就可以工作。
我有点担心我不知道它为什么有效。另一个问题是它没有出现在 TSqlModel 对象的官方文档中: https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.model.tsqlmodel_methods(v=sql.120).aspx
但它确实有效。至少到目前为止。
关于c# - SSDT TSqlModel.DeleteObjects 方法的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600557/