Amazon Relational Database Service (Amazon RDS) のリードレプリカで、プライマリインスタンスへの変更が非同期的に複製されています。インスタンスの作成時にログインが同期されません。インスタンスの作成時に、ログインを作成して同期させたいです。
解決策
プライマリインスタンスに SQL ログインを作成し、そのログインをリードレプリカと同期する
データベースエンジンインスタンスは SQL Server のログインを認証し、ログインパスワードをプライマリデータベースに保存します。SQL ログインは、単一データベース内のデータベースユーザーにマッピングすることも、複数データベース内の別々のユーザーにマッピングすることもできます。ログインとユーザーは一意のステートメント ID (SID) を生成します。リードレプリカのログインを同期する際、ログインの SID はプライマリインスタンスの SID と一致する必要があります。
プライマリインスタンスに SQL ログインを作成し、そのログインをリードレプリカと同期するには、次の手順を実行します。
-
プライマリインスタンスで次のクエリを実行し、testlogin という名前の SQL Server 用ログインを作成します。
USE [master]
GO
CREATE LOGIN [testlogin] WITH PASSWORD=N'Pa$$word';
-
プライマリインスタンスで次のクエリを実行し、プライマリインスタンスに testlogin が作成されたことを確認します。
SELECT name FROM sys.sql_logins WHERE name = 'testlogin';
-
プライマリインスタンスで次のクエリを実行し、testlogin にマッピングされる SID を特定します。
SELECT name, sid FROM sys.sql_logins WHERE name = 'testlogin';
出力例
name sid
-------------------------------------------------------------------------------
testlogin 0xEBF23823BDEAED42823C76C8706F4B6B
-
リードレプリカで次のクエリを実行し、プライマリインスタンスの SID にマッピングされる testlogin という名前の新しいログインを作成します。
CREATE Login testlogin WITH password = N'Pa$$word', SID = 0xEBF23823BDEAED42823C76C8706F4B6B;
-
リードレプリカで次のクエリを実行し、プライマリインスタンスと同じ SID を持つ新しいログインが作成されたことを確認します。
SELECT name, sid FROM sys.sql_logins WHERE name = 'testlogin';
プライマリインスタンスとリードレプリカに Windows ログインを作成する
Windows 認証による SQL Server ログインは、インスタンスレベルのログインであり、オペレーティングシステム (OS) が認証を管理します。Windows ログインは、ユーザーの AWS アカウント、ローカルセキュリティグループ、またはドメインアカウントにマッピングできます。
プライマリインスタンスとリードレプリカに Windows ログインを作成するには、次の手順を実行します。
-
プライマリインスタンスで次のクエリーを実行し、SQLAD\user1 という名前の Windows ログインを作成します。
CREATE LOGIN [SQLAD\user1] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
-
リードレプリカで次のコマンドを実行し、SQLAD\user1 という名前のログインを作成します。
CREATE LOGIN [SQLAD\user1] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
注: Amazon RDS は、プライマリデータベースに対する高レベルのアクセス許可を付与しません。したがって、Amazon RDS でログインを生成するのに、Microsoft が提供するストアドプロシージャ sp_help_revlogin または sp_hexadecimal を使用することはできません。