【发布时间】:2010-11-27 06:51:09
【问题描述】:
有没有办法使用 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'")
但是,我不希望内联对系统存储过程的调用。
有什么建议吗?
【问题讨论】:
标签: sql-server smo