web-dev-qa-db-ja.com

可用性グループでユーザーとログインをリンクする方法は?

可用性グループを作成し、アクティブなセカンダリレプリカのデータベースユーザーにログインをマップする必要があります。 (Node2)残念ながら、exec sp_change_users_loginまたはalter user with login、データベースが読み取り専用であることを通知するエラーメッセージが表示されます。当然のことですが、どのように修正すればよいかわかりません。昨夜フェイルオーバーして、Node2のログインを修正してから、Node1にフェイルバックしようとしましたが、Node1でのログイン/ユーザーマッピングが間違っています。それらを修正すると、Node2のログインは再びうまくいきません。

これは本番システムなので、今夜遅くまでやりたいことができません。テストラボではこの問題に遭遇しませんでした。違いは、以前にデータベースに参加する前にログインを作成したのに対し、今回は後で作成しようとし、プロセスを正しく文書化できなかったことです。 AGを停止して再構築することは、できれば避けたいものです。

問題は私には理にかなっています、私はそれを修正する方法を本当に知りません。

7

SIDが一致しないインスタンスに接続するだけで、ログインを再作成し、SIDを明示的に指定する必要があります。たとえば、孤立したユーザーがいるインスタンスでは、次のようにするとユーザーが返されます。

exec sp_change_users_login 'report';
go

UserSIDからSIDをコピーします。そして、そのインスタンスの名前を保持したい既存のログインがすでにある場合はできません。 ALTER LOGINを使用してSIDを変更する方法はありません。したがって、ログインを削除して再作成する必要があります。

drop login YourLogin;
go

create login YourLogin
with
    password = 'password',
    check_policy = off,     -- simple password and no check policy for example only
    sid = 0xC26909...................;
go

ここでも、CREATE LOGINsidパラメータを、UserSIDsp_change_users_loginを実行して取得したreportに設定します。

:レプリカ間でパスワードが一致しないように、この/これらのレプリカのパスワードを同じに設定する必要があります。

ここでの問題のログインはSQL Serverログインであると想定しています。これは、Windows Authドメインアカウントでは問題にならないためです。SIDは各インスタンスで同じであるべきだからです。

ここで含まれるデータベースを利用して、データベースプリンシパルをデータベースレベルで認証することもできます。そうすれば、孤立したユーザーについて心配する必要がなくなります。

これに関するいくつかのドキュメントがあります:
可用性グループのデータベースのログインとジョブの管理に関するBOLリファレンス
SQL Serverのインスタンス間でログインとパスワードを転送する方法に関するKB記事

また、これは言うまでもありませんが、開発/ QA環境でテストして、本番稼働前に適切な機能を確認および確認してください。

7
Thomas Stringer