web-dev-qa-db-ja.com

このユーザーでの復元後のSQL Serverユーザーのログインへの再バインド

SQL Server(v12.0.2000)データベースの復元を実行した後、ユーザーをログインに再マップする必要があることがわかりました(この問題は孤立したユーザーとして知られているようです)。そしてそれを行う最も簡単な方法の1つは、

use [MyDatabase];
alter user MyUser with login = MyUser;

それにもかかわらず、復元を達成した直後に、孤立した'MyUser'を使用して上記のコマンドを実行しようとしているため、USEコマンドは失敗します...

スクリプト内にあるため、最初のユーザーがログインに正しく再マップされるように、あるユーザーでrestoreを実行し、別のユーザーでalter userを実行することは避けたいと思います。

'MyUser'(問題なくマスターに接続できる)でこれを行う方法はありますか?

「MyUser」を次のように完全に修飾して試してみましたが、成功しませんでした。

use master;
alter user MyDatabase.MyUser with login = MyUser;

これが可能かどうか、そしてそれを行う方法はありますか?

6
Koresh

残念だけど違う。データベースプリンシパルとサーバープリンシパルは2つの別個のオブジェクトであることを忘れないでください。 Orphanを修正するまで、データベースにMyUserと呼ばれる孤立したユーザーがいても、サーバープリンシパルMyDatabaseMyUserにアクセスできません。

Orphanを修正するもう1つの方法は、サーバープリンシパルのSIDをデータベースプリンシパルのSIDと一致するように変更することです。これには、他のデータベースに孤立ファイルが作成されるリスクがあり、さらに重要なことには、この場合、プリンシパルを削除し、新しいSIDで再作成する必要があります。もちろん、その特定のIDを使用しては不可能です。

あなたの唯一の方法は、適切な権限を持つ別のIDを使用してこれを修正することです。これは、sysadmin権限を持つID(データベースプリンシパルが関連付けられていなくてもデータベースに接続する権限を持つ)か、データベースに対するDBOアクセス権を持つIDの可能性があります。これらは例であることに注意してください。サーバー/データベースプリンシパルを変更するために使用できる他のいくつかの権限があります。

3
Kenneth Fisher

Sp_change_users_loginを使用して、データベースユーザーのSIDを更新できます。 https://msdn.Microsoft.com/en-us/library/ms174378.aspx

または、sp_help_revloginを使用して本番サーバーからログインをスクリプト化し、DRユーザーを削除して、スクリプトで再作成することもできます。 https://support.Microsoft.com/en-us/kb/918992

2
Michael Brule