8

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

ただし、システム ストアド プロシージャへの呼び出しをインライン化しないことをお勧めします。

助言がありますか?

4

3 に答える 3

2

T-SQL ALTER LOGIN から ... WITH LOGIN = ...

ログイン = ログイン名

ログインの SID と一致するようにユーザーのセキュリティ識別子 (SID) を変更することにより、ユーザーを別のログインに再マップします。

サーバー間で SID を同期するため (そして最近は SQL ログインをほとんど使用しないため)、今は試していません。

ただし、これはUser.Alter Methodにマップされます。

だから、それはうまくいくかもしれません...

同じログインを使用したくない場合は、別のログインにマップして戻すことができると思います。

于 2009-09-10T19:58:24.293 に答える
0

私にとって、この構文はうまくいきました

    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

于 2016-04-22T09:17:34.897 に答える