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;