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
权限。
示例
A. 迁移单个用户
以下示例使用密码将名为 SQL 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;