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