如何複製我的 RDS for SQL Server 的使用者登入權限?

上次更新日期:2022-10-13

我想複製我的 Amazon Relation Database (Amazon RDS) for Microsoft SQL Server 使用者登入權限。該如何進行?

解決方案

附註:除非執行指令碼的使用者有權授與這些權限,否則,此指令碼不會對新的登入進行任何變更。如果使用者沒有授與權限的存取權限,則該權限不會顯示在指令碼中。這是因為用於存取指令碼的登入沒有檢視權限。此外,如果您嘗試在沒有授與權限時手動新增權限指令碼,則指令碼會失敗。

1.    複製並執行 MSSQL_RDS_Clone_Login 指令碼,以在您要複製使用者的環境中建立預存程序。稍後您可以使用此預存程序來建立使用者登入、資料庫使用者、伺服器層級和資料庫層級權限的複本。

您可以在任何不在 Amazon RDS for SQL Server 系統資料庫內的使用者資料庫中建立預存程序。根據您的使用案例,將 [DB_NAME] 取代為使用者資料庫的名稱。

下列指令碼會建立三個預存程序:

  • DuplicateLogin:針對每個資料庫中包含您要複製的登入權限,複製登入和重複的資料庫使用者。
  • GrantUserRoleMembership:將資料庫使用者權限和角色複製到新使用者。
  • DuplicateRDS:合併 DuplicateLoginGrantUserRoleMembership 預存程序的結果。

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_adminssis_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

此文章是否有幫助?


您是否需要帳單或技術支援?