Sql server 使用SQL SMO修复孤立用户?

Sql server 使用SQL SMO修复孤立用户?,sql-server,smo,Sql Server,Smo,有没有办法使用SQL SMO修复SQL 2005/2008数据库中的孤立用户 通过枚举用户并查找空的用户,您可以相对轻松地找到孤立用户。登录属性: using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Common; public static IList<string> GetOrphanedUsers(Server smoServer, string database)

有没有办法使用SQL SMO修复SQL 2005/2008数据库中的孤立用户

通过枚举用户并查找空的
用户,您可以相对轻松地找到孤立用户。登录
属性:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;    
public static IList<string> GetOrphanedUsers(Server smoServer, string database) {
       Database db = smoServer.Databases[database];

       List<string> orphanedUsers = new List<string>();
       foreach (User user in db.Users) {
          if (!user.IsSystemObject && user.Login == string.Empty) {
             orphanedUsers.Add(user.Name);
          }
       }

       return orphanedUsers;
    }
但是,我不希望内联调用系统存储过程

有什么建议吗?

来自T-SQL

LOGIN=登录名

将用户重新映射到 通过更改用户的 要匹配的安全标识符(SID) 登录名的SID

现在,我还没有尝试过,因为我会跨服务器同步SID(现在很少使用SQL登录)

然而,这映射到

所以,它可能会起作用


如果它不喜欢使用相同的登录名,我想您可以映射到另一个登录名并返回。

不幸的是,SMO在提供应该可用的方法方面并不比SQL-DMO好多少。您必须使用内嵌式SQL:

db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'")


对我来说,这种语法很好用

    db.ExecuteNonQuery("sp_change_users_login 'Auto_Fix', 'login_from_Report', NULL, 'p@ssword123!'")

我在这里找到了:

非常好的建议。不确定我是如何错过User.Alter()方法的。但是,似乎不允许设置User.Login,然后调用User.Alter()。它引发FailedOperationException,声明:“用户'MyorphandUser'的Alter失败”。FailedOperationException具有类型为SmoException的内部异常,该异常声明:“不允许修改用户对象的登录属性。必须删除并用所需属性重新创建对象。”也许仅仅通过SMOAPI去孤立是不可能的?只需执行SMO.Database.ExecuteNonQuery(“使用登录傻瓜登录改变用户FOO”)。这就是我最初希望避免的——将SQL连接到数据库中。但是,这就是我最终选择的路线。然而,我使用的是我提到的“sp_change_users_login”系统存储过程。这几乎是我从gbn的回答和到目前为止的评论中得出的结论。这感觉像是一个偷取答案,但据我所知,这是正确的答案。只是一个提示,MSDN文档中指出,此方法将在SQL server的未来版本中删除,并使用Alter user,正如Yoopegeek下面所述,它不适用于SMO。
db.ExecuteNonQuery("sp_change_users_login 'update_one', 'ORPHANED_USERNAME', 'ORPHANED_USERNAME'")
    db.ExecuteNonQuery("sp_change_users_login 'Auto_Fix', 'login_from_Report', NULL, 'p@ssword123!'")