sql-server – 使用SQL 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,但我不知道如何将它传播回服务器.它似乎仅在您创建新用户时可用.

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

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

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

有什么建议?

解决方法

不幸的是,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.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03