2009-09-10 3 views
8

Есть ли способ исправить потерянного пользователя в базе данных SQL 2005/2008 с использованием SQL SMO?Фиксирование осиротевших пользователей 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'") 

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

Любые предложения?

ответ

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'") 
+0

Это в значительной степени то, что я заключил из ответа gbn и комментариев до сих пор. Это похоже на кражу ответа, но, насколько я могу судить, это правильный ответ. – Yoopergeek

+0

Просто вверху, документация MSDN, http://msdn.microsoft.com/en-us/library/ms174378.aspx, говорится, что этот метод будет удален в будущих версиях SQL-сервера и пользователю Alter User, который, как Yoopergeek заявил ниже не работает с SMO. – Despertar

2

С T-SQL ALTER LOGIN ... WITH LOGIN = ...

ВХОД = login_name

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

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

Однако это карты на User.Alter Method.

Таким образом, он может работать ...

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

+1

Отлично предложение. Не знаю, как я пропустил метод User.Alter(). Однако это похоже на настройку User.Login, а затем вызов User.Alter() не разрешен. Он выдает исключение FailedOperationException, в котором говорится: «Alter не удалось для пользователя MyOrphanedUser». В FailedOperationException есть внутреннее исключение типа SmoException, которое гласит: «Модифицировать свойство Login для объекта User не разрешено.Вы должны удалить и воссоздать объект с требуемым свойством ». Возможно, это просто невозможно для де-сироты через SMO API? – Yoopergeek

+0

Извините,« я еще не пробовал » – gbn

+5

просто сделать Smo.Database.ExecuteNonQuery (« Alter User FOO With Login FooLogin "). – RBarryYoung

Смежные вопросы