sp_migrate_user_to_contained (Transact-SQL)
适用于:SQL Server
将映射到 SQL Server 登录名的数据库用户转换为具有密码的包含的数据库用户。 在包含数据库中,使用此过程删除安装数据库的 SQL Server 实例的依赖项。 sp_migrate_user_to_contained 将用户与原始 SQL Server 登录名分开,以便可以为包含的数据库单独管理密码和默认语言等设置。 在将包含的数据库移动到 SQL Server 数据库引擎的其他实例之前,可以使用sp_migrate_user_to_contained来消除对当前 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'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 数据库中的登录名。 若要在禁用登录名时进行连接,连接必须提供包含的数据库名称作为初始目录作为连接字符串的一部分。
返回代码值
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. 迁移单个用户
以下示例使用密码将名为 SQL Server 登录名 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 ;