sp_migrate_user_to_contained (Transact-SQL)
將對應至 SQL Server 登入的資料庫使用者移轉為具有密碼之自主資料庫使用者。 在自主資料庫中,使用這個程序來移除已安裝資料庫之 SQL Server 執行個體的相依性。 sp_migrate_user_to_contained 會分隔使用者與原始的 SQL Server 登入,因此自主資料庫設定 (例如密碼和預設語言) 可以分別管理。 在自主資料庫移至不同的 SQL Server Database Engine 執行個體之前,sp_migrate_user_to_contained 可用來消除目前 SQL Server 執行個體登入的相依性。
注意:此程序僅用於自主資料庫。 如需詳細資訊,請參閱<自主資料庫>。
語法
sp_migrate_user_to_contained [ @username = ] N'user' ,
[ @rename = ] { N'copy_login_name' | N'keep_name' } ,
[ @disablelogin = ] { N'disable_login' | N'do_not_disable_login' }
引數
[@username = ] N'user'
目前自主資料庫中對應至 SQL Server 已驗證登入的使用者名稱。 值為 sysname,預設值為 NULL。[@rename = ] N'copy_login_name' | N'keep_name'
依據登入的資料庫使用者與登入名稱有不同的使用者名稱時,在移轉期間使用 keep_name 來保留資料庫使用者名稱。 使用 copy_login_name,以登入名稱 (而非使用者名稱) 建立新的自主資料庫使用者。 依據登入的資料庫使用者與登入名稱有相同的使用者名稱時,這兩個選項會在不變更名稱的情況下建立自主資料庫使用者。[@disablelogin = ] N'disable_login' | N'do_not_disable_login'
disable_login 停用 master 資料庫中的登入。 若要在停用登入時進行連接,連接必須提供自主資料庫名稱為 initial catalog,做為連接字串的一部分。
傳回碼值
0 (成功) 或 1 (失敗)
備註
不論登入的屬性或權限,sp_migrate_user_to_contained 會建立具有密碼之自主資料庫使用者。 例如,如果登入已停用,或使用者被拒絕資料庫的 CONNECT 權限,此程序會成功。
sp_migrate_user_to_contained 有下列限制。
使用者名稱不能已存在於資料庫中。
無法轉換內建使用者,例如 dbo 和 guest。
使用者不能在已簽署之預存程序的 EXECUTE AS 子句中指定。
使用者不能擁有包含 EXECUTE AS OWNER 子句的預存程序。
sp_migrate_user_to_contained 不能用在系統資料庫。
安全性
當移轉使用者時,小心不要停用或刪除 SQL Server 執行個體的所有系統管理員登入。 如果刪除了所有登入,請參閱<當系統管理員遭到鎖定時連接到 SQL Server>。
如果 BUILTIN\Administrators 登入存在,系統管理員可以藉由使用 [以系統管理員身分執行] 選項啟動他們的應用程式,進行連接。
權限
需要 CONTROL SERVER 權限。
範例
A.移轉單一使用者
下列範例會將名為 Barry 的 SQL Server 登入移轉為具有密碼之自主資料庫使用者。 此範例會保留使用者名稱,而且將登入保留為已啟用。
sp_migrate_user_to_contained
@username = N'Barry',
@rename = N'keep_name',
@disablelogin = N'do_not_disable_login' ;
B.將所有具有登入的資料庫使用者移轉為沒有登入的自主資料庫使用者
下列範例會將以 SQL Server 登入為基礎的所有使用者移轉至具有密碼之自主資料庫使用者。 此範例會排除未啟用的登入。 您必須在自主資料庫中執行此範例。
DECLARE @username sysname ;
DECLARE user_cursor CURSOR
FOR
SELECT dp.name
FROM sys.database_principals AS dp
JOIN sys.server_principals AS sp
ON dp.sid = sp.sid
WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;
OPEN user_cursor
FETCH NEXT FROM user_cursor INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE sp_migrate_user_to_contained
@username = @username,
@rename = N'keep_name',
@disablelogin = N'disable_login';
FETCH NEXT FROM user_cursor INTO @username
END
CLOSE user_cursor ;
DEALLOCATE user_cursor ;