Есть ли способ исправить потерянного пользователя в базе данных 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'")
Однако я бы предпочел не выполнять встроенный вызов системной хранимой процедуры.
Есть предложения?