我想複製 Amazon Relational Database Service (Amazon RDS) for SQL Server 的使用者登入權限。
解決方法
建立預存程序
若要複製您的 RDS for SQL Server,您必須先在要複製使用者的環境中建立預存程序。
若要建立預存程序,請執行 MSSQL_RDS_Clone_Login 指令碼。如需詳細資訊,請參閱 GitHub 網站上的 MSSQL_RDS_Clone_Login 指令碼。您可以在任何不屬於 RDS for SQL Server 系統資料庫的使用者資料庫中建立預存程序。
除非執行指令碼的使用者具有授與這些權限的存取權,否則 MSSQL_RDS_Clone_Login 指令碼無法對新的登入進行變更。如果使用者沒有授與權限的存取權,則這些權限不會顯示在指令碼中。如果您沒有授與權限,且嘗試手動將這些權限新增至指令碼,則指令碼會失敗。
MSSQL_RDS_Clone_Login 指令碼會建立三個預存程序:
- **DuplicateLogin:**此程序會根據您要複製來源的各個資料庫的登入權限,複製登入和資料庫使用者。
- **GrantUserRoleMembership:**此程序會將資料庫使用者權限和角色複製到新使用者。
- **DuplicateRDS:**此程序會整合 DuplicateLogin 和 GrantUserRoleMembership 這兩個預存程序的結果。
執行預存程序
若要執行預存程序,請完成以下步驟:
-
開啟新的 Transact-SQL (TSQL) 視窗。
-
按下 CTRL+T,以確認結果為文字格式。
-
執行以下指令碼。
SQL 登入:
USE [DB_NAME]
EXEC DuplicateRDS @NewLogin=[duplicate_login_name]
,@NewLoginPwd = password
,@LoginToDuplicate = primary_login
,@WindowsLogin = F
,@DatabaseName=NULL
**注意:**將 DB_NAME 替換為使用者資料庫名稱,將 duplicate_login_name 替換為您的登入名稱,並將 password 替換為您的密碼。
Windows 登入:
USE [DB_NAME]
EXEC DuplicateRDS @NewLogin=[domain\duplicate_login_name]
,@LoginToDuplicate = primary_login
,@NewLoginPwd = NULL
,@WindowsLogin = T
,@DatabaseName=NULL
**注意:**將 DB_NAME 替換為使用者資料庫名稱,將 domain 替換為您的網域名稱,並將 duplicate_login_name 替換為您的登入名稱。
-
產生指令碼後,從 Results (結果) 索引標籤複製指令碼,然後在新的查詢視窗中執行。
**注意:**指令碼執行後,您的 SQL Server 登入會產生與主要登入類似的伺服器層級和資料庫層級權限。
-
產生的登入不包含 Microsoft SQL Server Integration Services (SSIS) SSISDB 的 ssis_admin 和 ssis_logreader 權限。如果您需要這些權限,請執行以下命令:
ALTER ROLE [ssis_admin] ADD MEMBER [mydomain\user_name]
ALTER ROLE [ssis_logreader] ADD MEMBER [mydomain\user_name]
GO
**注意:**將 mydomain 替換為您的網域名稱,並將 user_name 替換為您的使用者名稱。由於預存程序使用暫存資料表,您可能會收到順序混亂的指令碼輸出。如果發生這種情況,請卸除並重新建立預存程序。
-
若要檢查孤立使用者,請執行以下指令碼:
Use [DB_NAME] ;
GO
exec sp_change_users_login @Action='Report' ;
GO
**注意:**將 DB_NAME 替換為使用者資料庫名稱。
-
若要卸除孤立使用者,請執行以下指令碼:
Use [DB_NAME] ;
GO
exec sp_revokedbaccess 'username'
GO
**注意:**將 DB_NAME 替換為使用者資料庫名稱,並將 username 替換為您的使用者名稱。
-
如果您在複製登入後不想保留這些預存程序,請執行以下指令碼:
USE \[DB\_NAME\] ;
GO
DROP PROCEDURE \[dbo\].\[DuplicateRDS\]
GO
DROP PROCEDURE \[dbo\].\[DuplicateLogin\]
GO
DROP PROCEDURE \[dbo\].\[GrantUserRoleMembership\]
GO
**注意:**將 DB_NAME 替換為使用者資料庫名稱。