sp_migrate_user_to_contained (Transact-SQL)

将映射到 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 [ @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 数据库中禁用登录名。 若要在禁用登录名时进行连接,连接必须将包含数据库名称作为 initial catalog 提供以作为连接字符串的一部分。

返回代码值

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.迁移单个用户

以下示例将名为 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 ;

请参阅

概念

迁移到部分包含的数据库

包含数据库