有没有办法使用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;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,修复并不像将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'")
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿不内联对系统存储过程的调用.
有什么建议?
不幸的是,SMO并没有比SQL-DMO更好地提供应该可用的方法.你将不得不使用内联SQL:
db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'")
Run Code Online (Sandbox Code Playgroud)
要么
db.ExecuteNonQuery("sp_change_users_login 'update_one', 'ORPHANED_USERNAME', 'ORPHANED_USERNAME'")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2211 次 |
最近记录: |