sp_migrate_user_to_contained (Transact-SQL)

適用於:SQL Server

將對應至 SQL Server 登入的資料庫用戶,轉換為具有密碼的自主資料庫使用者。 在自主資料庫中,使用此程式移除安裝資料庫之 SQL Server 實例的相依性。 sp_migrate_user_to_contained 會分隔使用者與原始 SQL Server 登入,以便個別管理自主資料庫的密碼和預設語言等設定。

sp_migrate_user_to_contained可以在將自主資料庫移至 SQL Server 資料庫引擎 的不同實例之前使用,以消除目前 SQL Server 實例登入的相依性。

警告

使用 sp_migrate_user_to_contained時請小心,因為您將無法反轉效果。 這個程式只用於自主資料庫中。 如需相關資訊,請參閱 自主資料庫

語法

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'username'

目前自主資料庫中對應至 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'

用來停用資料庫中的 master 登入。 若要在停用登入時連線,連線必須提供自主資料庫名稱作為 initial catalog 連接字串的一部分。

傳回碼值

0 (成功) 或 1 (失敗)。

備註

sp_migrate_user_to_contained 會使用密碼建立自主資料庫使用者,而不論登入的屬性或許可權為何。 例如,如果停用登入,或使用者拒絕 CONNECT 資料庫的許可權,則程式可能會成功。

sp_migrate_user_to_contained 具有下列限制。

  • 資料庫中還不能有用戶名稱。
  • 內建使用者,例如 dboguest,無法轉換。
  • 無法在已簽署預存程式的 子句中 EXECUTE AS 指定使用者。
  • 用戶無法擁有包含 子句的 EXECUTE AS OWNER 預存程式。
  • sp_migrate_user_to_contained 無法在系統資料庫中使用。

安全性

移轉使用者時,請小心不要停用或刪除 SQL Server 實例中的所有系統管理員登入。 如果刪除所有登入,請參閱 當系統管理員遭到鎖定時連線到 SQL Server。

BUILTIN\Administrators如果登入存在,系統管理員可以使用 [以系統管理員身分執行] 選項啟動其應用程式來連線。

權限

需要 CONTROL SERVER 權限。

範例

A. 移轉單一使用者

下列範例會將名為 Barry的 SQL Server 登入移轉至具有密碼的自主資料庫使用者。 此範例不會變更用戶名稱,並保留啟用的登入。

EXEC 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
INNER 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;