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, так как вы не сможете отменить эффект. Эта процедура используется только в автономной базе данных. Дополнительные сведения см. в разделе Contained Databases.

Синтаксис

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 имеет следующие ограничения.

  • Имя пользователя еще не может существовать в базе данных.
  • Встроенные пользователи, например dbo и гостевой, не могут быть преобразованы.
  • Пользователь не может быть указан в EXECUTE AS предложении подписанной хранимой процедуры.
  • Пользователь не может владеть хранимой процедурой, включающей EXECUTE AS OWNER предложение.
  • sp_migrate_user_to_contained нельзя использовать в системной базе данных.

Безопасность

При миграции пользователей не следует отключать или удалять все имена входа администратора из экземпляра SQL Server. Если все имена входа удалены, см. статью "Подключение к SQL Server", когда системные администраторы заблокированы.

BUILTIN\Administrators Если имя входа присутствует, администраторы могут подключаться, запуская приложение с помощью параметра "Запуск от имени администратора".

Разрешения

Требуется разрешение CONTROL SERVER.

Примеры

А. Перенос одного пользователя

В следующем примере выполняется перенос имени входа BarrySQL 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;