使用SQL SMO修复孤立用户?

时间:2009-09-10 19:03:40

标签: sql-server smo

有没有办法使用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确实有一个setter,但我不知道如何将它传播回服务器。它似乎仅在您创建新User时才可用。

我考虑过将用户从数据库中删除并将服务器登录重新绑定到数据库,但这会带来额外的复杂性。重复分配默认模式,角色等复杂问题,如果他们在数据库中拥有模式,那么当您通过这些更改进行级联时会遇到更多麻烦。这足以让你想要内联SQL并完成它:

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分: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'")

答案 1 :(得分:2)

来自T-SQL ALTER LOGIN ... WITH LOGIN = ...

  

LOGIN = login_name

     

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

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

但是,这会映射到User.Alter Method

所以,它可能有用......

如果不喜欢使用相同的登录信息,我估计您可以映射到另一个登录信息并返回。

答案 2 :(得分: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