Поделиться через


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 на пользователя автономной базы данных с паролем. Пример не изменяет имя пользователя и сохраняет имя входа в качестве включенного.

EXECUTE sp_migrate_user_to_contained
    @username = N'Barry',
    @rename = N'keep_name',
    @disablelogin = N'do_not_disable_login';

B. Перенос всех пользователей базы данных с именами входа в автономные пользователи базы данных без входа

В следующем примере все пользователи, основанные на имени входа SQL Server, переносятся на пользователей автономной базы данных с паролями. В примере исключаются имена входа, которые не включены. Этот пример должен выполняться в автономной базе данных.

DECLARE @username AS 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;