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
セッターはありますが、それをサーバーに伝達する方法を知りません。新しい を作成する場合にのみ使用できるようですUser
。
データベースからユーザーを削除し、サーバー ログインをデータベースに再バインドすることを検討しましたが、これにはさらに複雑な問題が伴います。デフォルトのスキーマ、ロールの再割り当てなどの複雑さ、およびそれらがデータベース内のスキーマを所有している場合、それらの変更をカスケードするにつれて、より多くの問題が発生します。SQL をインライン化し、それを完了させたいと思うようにするだけで十分です。
ServerConnection server = new ServerConnection("MyBox\SQLInstance");
Database db = server.Databases["MyDatabase"];
db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'")
ただし、システム ストアド プロシージャへの呼び出しをインライン化しないことをお勧めします。
助言がありますか?