我想複製我的 Amazon Relation Database (Amazon RDS) for Microsoft SQL Server 使用者登入權限。該如何進行?
解決方案
**附註:**除非執行指令碼的使用者有權授與這些權限,否則,此指令碼不會對新的登入進行任何變更。如果使用者沒有授與權限的存取權限,則該權限不會顯示在指令碼中。這是因為用於存取指令碼的登入沒有檢視權限。此外,如果您嘗試在沒有授與權限時手動新增權限指令碼,則指令碼會失敗。
1. 複製並執行 MSSQL_RDS_Clone_Login 指令碼,以在您要複製使用者的環境中建立預存程序。稍後您可以使用此預存程序來建立使用者登入、資料庫使用者、伺服器層級和資料庫層級權限的複本。
您可以在任何不在 Amazon RDS for SQL Server 系統資料庫內的使用者資料庫中建立預存程序。根據您的使用案例,將 [DB_NAME] 取代為使用者資料庫的名稱。
下列指令碼會建立三個預存程序:
- **DuplicateLogin:**針對每個資料庫中包含您要複製的登入權限,複製登入和重複的資料庫使用者。
- **GrantUserRoleMembership:**將資料庫使用者權限和角色複製到新使用者。
- **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. 指令碼產生後,從結果索引標籤複製指令碼,然後在新的查詢視窗中執行指令碼。指令碼執行之後,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
**備註:**由於預存程序中使用暫存資料表,指令碼輸出可能會以無序的方式發生。如果發生這種情況,請刪除並重新建立預存程序,以將其轉換為正確的格式。
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