Исправление осиротевших пользователей с помощью SQL SMO? - PullRequest
8 голосов
/ 10 сентября 2009

Есть ли способ исправить потерянного пользователя в базе данных SQL 2005/2008 с помощью SQL SMO?

Вы можете относительно легко найти осиротевших пользователей, перечисляя пользователей и ища пустое свойство 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'")

Однако я бы предпочел не выполнять встроенный вызов системной хранимой процедуры.

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2009

К сожалению, 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'")
2 голосов
/ 10 сентября 2009

Из T-SQL ALTER LOGIN ... WITH LOGIN = ...

ВХОД = имя_ логина

Переназначает пользователя на другой логин, изменив пользователя Идентификатор безопасности (SID) для соответствия логин SID.

Теперь я не пробовал, потому что я синхронизировал бы SID между серверами (и редко использую логины SQL в наши дни)

Однако это соответствует методу User.Alter .

Так что, это может сработать ...

Если ему не нравится использовать тот же логин, я считаю, что вы можете сопоставить с другим логином и обратно.

0 голосов
/ 22 апреля 2016

Для меня этот синтаксис работал нормально

    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

...