8

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

通过枚举用户并查找空User.Login属性,您可以相对轻松地找到孤立用户:

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;
    }

不幸的是,修复并不像将User.Login属性设置为匹配的服务器登录名那么简单。User.Login确实有一个二传手,但我不知道有一种方法可以将它传播回服务器。它仅在您创建新的User.

我考虑从数据库中删除用户并将服务器登录重新绑定到数据库,但随之而来的是额外的复杂性。诸如重新分配默认模式、角色以及如果他们在数据库中拥有一个模式等复杂情况,当您逐级进行这些更改时,您会遇到更多麻烦。足以让您想要内联 SQL 并完成它:

ServerConnection server = new ServerConnection("MyBox\SQLInstance");
Database db = server.Databases["MyDatabase"];
db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'")

但是,我不希望内联对系统存储过程的调用。

有什么建议么?

4

3 回答 3

5

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

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

或者

db.ExecuteNonQuery("sp_change_users_login 'update_one', 'ORPHANED_USERNAME', 'ORPHANED_USERNAME'")
于 2009-09-15T14:20:07.067 回答
2

从 T-SQL ALTER LOGIN ... WITH LOGIN = ...

登录 = 登录名

通过更改用户的安全标识符 (SID) 以匹配登录名的 SID,将用户重新映射到另一个登录名。

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

但是,这映射到User.Alter Method

所以,它可能会工作......

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

于 2009-09-10T19:58:24.293 回答
0

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

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

我在这里找到它:http: //dbadiaries.com/using-sp_change_users_login-to-fix-sql-server-orphaned-users#sthash.Q85ewEr9.dpuf

于 2016-04-22T09:17:34.897 回答