Amazon Relation Database (Amazon RDS) for Microsoft SQL Server ユーザーログイン許可のクローンを作成したいと考えています。これを行うにはどうすればよいですか?
解決方法
注: スクリプトを実行しているユーザーがそれらの許可を付与するためのアクセス権を持っていない限り、このスクリプトは新しいログインに変更を加えません。ユーザーに許可を付与するためのアクセス権がない場合、その許可はスクリプトに表示されません。これは、スクリプトにアクセスするために使用されたログインには表示権限がないためです。また、付与許可を持っていないときに許可スクリプトを手動で追加しようとすると、スクリプトは失敗します。
1. MSSQL_RDS_Clone_Login スクリプトをコピーして実行し、ユーザーを複製する環境にストアドプロシージャを作成します。このストアドプロシージャを後で使用して、ユーザーログイン、データベースユーザー、サーバーレベル、およびデータベースレベルの許可の複製を作成します。
ストアドプロシージャは、Amazon RDS for SQL Server システムデータベース内にない任意のユーザーデータベースで作成できます。ユースケースに応じて、[DB_NAME] をユーザーデータベースの名前に置き換えます。
次のスクリプトは、3 つのストアドプロシージャを作成します。
- DuplicateLogin: ログインと、コピー元のログイン許可を含む各データベースのログインについての重複データベースユーザーを複製します。
- GrantUserRoleMembership: DB ユーザーの許可とロールを新しいユーザーに複製します。
- DuplicateRDS: DuplicateLogin と GrantUserRoleMembership の両方のストアドプロシージャの結果を統合します。
2. ストアドプロシージャを作成したら、新しい TSQL ウィンドウを開き、次の形式を使用してストアドプロシージャを実行します。
注: スクリプトを実行する前に、キーボードの CTRL+T を押して、結果がテキスト形式であることを確認してください。
--SQL login
EXEC DuplicateRDS @NewLogin=[<duplicate_login_name>]
,@NewLoginPwd = password
,@LoginToDuplicate = master_login
, @WindowsLogin = F
,@DatabaseName=NULL
-- Windows login
EXEC DuplicateRDS @NewLogin=[<domain\duplicate_login_name>]
,@LoginToDuplicate = master_login
,@NewLoginPwd = NULL
, @WindowsLogin = T
,@DatabaseName=NULL
3. スクリプトが生成されたら、[Results] (結果) タブからスクリプトをコピーし、新しいクエリウィンドウで実行します。スクリプトを実行すると、マスターログインと同様のサーバーレベルおよびデータベースレベルの許可で SQL Server ログインが生成されます。
注: この例では、ssis_admin と ssis_logreader の SSISDB 許可は含まれていません。これらの許可が必要な場合は、個別に指定してください。
ALTER ROLE [ssis_admin] ADD MEMBER [mydomain\user_name]
ALTER ROLE [ssis_logreader] ADD MEMBER [mydomain\user_name]
GO
注: ストアドプロシージャで一時テーブルが使用されているため、スクリプト (OUT) が不規則に発生する可能性があります。これが発生した場合は、ストアドプロシージャを削除してから再作成し、正しい形式にします。
4. 孤立したユーザーがいる場合は、次のスクリプトを実行します。このスクリプトは、スクリプトが失敗したデータベース内の孤立したユーザーをチェックし、それらの孤立したユーザーを削除します。
次のスクリプトは、孤立したユーザーをチェックします。
Use [DB_NAME] ;
GO
exec sp_change_users_login @Action='Report' ;
GO
次のスクリプトは、孤立したユーザーを削除します。
Use [DB_NAME] ;
GO
exec sp_revokedbaccess 'username'
GO
5. (コンプライアンスなどの理由で) ログインを複製した後もストアドプロシージャを保持したくない場合は、次のスクリプトを実行します。
USE [DB_NAME]
GO
DROP PROCEDURE [dbo].[DuplicateRDS]
GO
DROP PROCEDURE [dbo].[DuplicateLogin]
GO
DROP PROCEDURE [dbo].[GrantUserRoleMembership]
GO