CREATE USER (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 数据库

向当前数据库添加用户。 以下列表展示了13种用户类型及最基本语法示例:

Note

虽然 Microsoft Entra ID 是 Azure Active Directory (Azure AD) 的新名称,但为了防止中断现有环境,Azure AD 仍保留在一些硬编码的元素中,例如 UI 字段、连接提供程序、错误代码和 cmdlet。 在本文中,这两个名称可以互换。

基于登录名的用户 master

  • 基于 Windows Active Directory 帐户的登录名的用户。 CREATE USER [Contoso\test];

  • 基于 Windows 组的登录名的用户。 CREATE USER [Contoso\Sales];

  • 用户基于登录,使用SQL Server认证。 CREATE USER Mary;

  • 基于 Microsoft Entra 登录名的用户。 CREATE USER [test@contoso.com] FROM LOGIN [test@contoso.com]

    Note

    Microsoft Entra 服务器主体(登录名)目前以公共预览版提供Azure SQL 数据库。

    Note

    Microsoft Fabric 中的 SQL 数据库不支持基于登录的用户或登录。

在数据库中进行身份验证 的用户——使用包含用户,帮助你的数据库更具可移植性。
在 Azure SQL 数据库 中始终被允许。 在 SQL Server 中,只能用于包含的数据库。

  • 基于无登录名的 Windows 用户的用户。 CREATE USER [Contoso\test];

  • 基于无登录名的 Windows 组的用户。 CREATE USER [Contoso\Sales];

  • 基于 Microsoft Entra 用户的 SQL 数据库 或 Azure Synapse Analytics 中的用户。 CREATE USER [test@contoso.com] FROM EXTERNAL PROVIDER;

  • 拥有密码的包含数据库用户。 (在 Azure Synapse Analytics 中不可用。)CREATE USER Mary WITH PASSWORD = '********';

基于通过 Windows 组登录名连接的 Windows 主体的用户

  • 基于无登录名但可通过 Windows 组中的成员身份连接到数据库引擎的 Windows 用户的用户。 CREATE USER [Contoso\test];

  • 基于无登录名但可通过不同 Windows 组中的成员身份连接到数据库引擎的 Windows 组的用户。 CREATE USER [Contoso\test];

无法进行身份验证的用户 - 这些用户无法登录到 SQL Server 或SQL 数据库。

  • 没有登录名的用户。 无法登录,但可以授予权限。 CREATE USER CustomApp WITHOUT LOGIN;
  • 基于证书的用户。 无法登录,但可以授予权限,并且可以对模块进行签名。 CREATE USER TestProcess FOR CERTIFICATE Contoso50;
  • 基于非对称密钥的用户。 无法登录,但可以授予权限,并且可以对模块进行签名。 CREATE User TestProcess FROM ASYMMETRIC KEY Contoso09;

Transact-SQL 语法约定

Syntax

SQL Server、Azure SQL 数据库和 Azure SQL 托管实例的语法

-- Syntax Users based on logins in master
CREATE USER user_name
    [
        { FOR | FROM } LOGIN login_name
    ]
    [ WITH <limited_options_list> [ , ... ] ]
[ ; ]

-- Users that authenticate at the database
CREATE USER
    {
      windows_principal [ WITH <options_list> [ , ... ] ]

    | user_name WITH PASSWORD = 'password' [ , <options_list> [ , ... ]
    | Microsoft_Entra_principal FROM EXTERNAL PROVIDER [ WITH OBJECT_ID = 'objectid' ]
    }

 [ ; ]

-- Users based on Windows principals that connect through Windows group logins
CREATE USER
    {
          windows_principal [ { FOR | FROM } LOGIN windows_principal ]
        | user_name { FOR | FROM } LOGIN windows_principal
}
    [ WITH <limited_options_list> [ , ... ] ]
[ ; ]

-- Users that cannot authenticate
CREATE USER user_name
    {
         WITHOUT LOGIN [ WITH <limited_options_list> [ , ... ] ]
       | { FOR | FROM } CERTIFICATE cert_name
       | { FOR | FROM } ASYMMETRIC KEY asym_key_name
    }
 [ ; ]

<options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | DEFAULT_LANGUAGE = { NONE | lcid | language name | language alias }
    | SID = sid
    | ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON | OFF ] ]

<limited_options_list> ::=
      DEFAULT_SCHEMA = schema_name ]
    | ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON | OFF ] ]

-- SQL Database syntax when connected to a federation member
CREATE USER user_name
[;]

-- Syntax for users based on Microsoft Entra logins for Azure SQL Managed Instance
CREATE USER user_name
    [   { FOR | FROM } LOGIN login_name  ]
    | FROM EXTERNAL PROVIDER
    [ WITH <limited_options_list> [ , ... ] ]
[ ; ]

<limited_options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | DEFAULT_LANGUAGE = { NONE | lcid | language name | language alias }
    | ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON | OFF ] ]

Azure Synapse Analytics 的语法

CREATE USER user_name
    [ { { FOR | FROM } { LOGIN login_name }
      | WITHOUT LOGIN
    ]
    [ WITH DEFAULT_SCHEMA = schema_name ]
[;]

CREATE USER Microsoft_Entra_principal FROM EXTERNAL PROVIDER
    [ WITH DEFAULT_SCHEMA = schema_name ]
[;]

Microsoft Fabric 和 Azure SQL 数据库中 SQL 数据库的语法

CREATE USER
    {
    Microsoft_Entra_principal FROM EXTERNAL PROVIDER [ WITH <limited_options_list> [ , ... ] ]
    | Microsoft_Entra_principal WITH <options_list> [ , ... ]
    }
 [ ; ]

-- Users that cannot authenticate
CREATE USER user_name
    {    WITHOUT LOGIN [ WITH DEFAULT_SCHEMA = schema_name ]
       | { FOR | FROM } CERTIFICATE cert_name
       | { FOR | FROM } ASYMMETRIC KEY asym_key_name
    }
 [ ; ]

<limited_options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | OBJECT_ID = 'objectid'

<options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | SID = sid
    | TYPE = { X | E }

Arguments

user_name

指定在此数据库中用于识别该用户的名称。 user_name 为 sysname。 它的长度最多是 128 个字符。 在创建基于 Windows 主体的用户时,除非指定其他用户名,否则 Windows 主体名称将成为用户名。

LOGIN login_name

指定要为其创建数据库用户的登录名。 login_name 必须是服务器中的有效登录名。 可以是基于 Windows 主体(用户或组)、使用 SQL Server 身份验证的登录名,也可以使用 Microsoft Entra 主体(用户、组或应用程序)登录名。 当此 SQL Server 登录名进入数据库时,它将获取正在创建的这个数据库用户的名称和 ID。 在创建从 Windows 主体映射的登录名时,请使用格式 [domainName<>loginName\]。 有关示例,请参阅语法摘要。

如果该CREATE USER语句是 SQL 批处理中唯一的语句,Azure SQL 数据库 支持 WITH LOGIN 子句。 如果该 CREATE USER 语句不是SQL批处理中唯一的语句,或者在动态SQL中运行,WITH LOGIN 子句就不被支持。

WITH DEFAULT_SCHEMA = schema_name

指定服务器解析此数据库用户的对象名称时搜索的第一个架构。

'windows_principal'

指定正为其创建数据库用户的 Windows 主体。 windows_principal 可以是 Windows 用户或 Windows 组。 即使 windows_principal 没有登录名,也会创建该用户。 连接 SQL Server 时,如果 windows_principal 没有登录名,Windows 主体必须通过有登录名的 Windows 组中的成员身份在数据库引擎中进行身份验证,或者连接字符串必须将包含的数据库指定为初始目录。 在从 Windows 主体创建用户时,请使用格式 [domainName<>loginName\]。 有关示例,请参阅语法摘要。 基于 Active Directory 用户的用户的名称限制为少于 21 个字符。

'Microsoft_Entra_principal'

适用于:SQL Server 2022(16.x)及更高版本,SQL Database,SQL 托管实例,Azure Synapse Analytics,Microsoft Fabric 中的 SQL 数据库

指定要为其创建数据库用户的Microsoft Entra 主体。 Microsoft_Entra_principal 可以是Microsoft Entra 用户、Microsoft Entra 组或 Microsoft Entra 应用程序。 (Microsoft Entra 用户无法在 SQL 数据库 中登录 Windows 身份验证;只有数据库用户。连接字符串必须将包含的数据库指定为初始目录。

对于 Microsoft Entra 主体,语CREATE USER法要求:

  • Microsoft Entra 用户的 Microsoft Entra 对象的 UserPrincipalName。

    • CREATE USER [test@contoso.com] FROM EXTERNAL PROVIDER;
    • CREATE USER [alice@fabrikam.onmicrosoft.com] FROM EXTERNAL PROVIDER;
  • Microsoft Entra 服务器主体(登录名) 引入了创建映射到数据库中Microsoft Entra 登录 master 名的用户。 例如: CREATE USER [test@contoso.com] FROM LOGIN [test@contoso.com];

  • 不支持Microsoft属于 2048 Microsoft Entra 安全组的成员的 Entra 用户和服务主体(应用程序)登录到 Azure SQL 数据库、Azure SQL 托管实例 或 Azure Synapse 中的数据库。

  • Microsoft Entra 组和 Microsoft Entra 应用程序的 Microsoft Entra 对象的 DisplayName。 如果有 Nurses 安全组,可使用:

    • CREATE USER [Nurses] FROM EXTERNAL PROVIDER;

有关详细信息,请参阅使用 Microsoft Entra 身份验证连接到 SQL 数据库。

有关 SQL Server 中Microsoft Entra 身份验证的详细信息,请参阅 教程:为 Azure Arc 启用的 SQL Server 设置Microsoft Entra 身份验证。

WITH PASSWORD = 'password'

适用于:SQL Server 2012(11.x)及以后版本,SQL 数据库。

只能在包含数据库中使用。 为正在创建的用户指定密码。

从SQL Server 2012(11.x)开始,SQL Server和Azure SQL 数据库使用了SHA-512哈希和32位随机唯一盐。 此方法使攻击者无法推断密码。

SQL Server 2025 (17.x) 引入了迭代哈希算法,RFC2898也称为 基于密码的密钥派生函数 (PBKDF)。 此算法仍使用 SHA-512,但多次对密码进行哈希处理(100,000 次迭代),显著减缓了暴力攻击的速度。 此更改增强了密码保护,以应对不断变化的安全威胁,并帮助客户遵守 NIST SP 800-63b 指南。 此安全增强功能使用更强大的哈希算法,这可能会稍微增加 SQL 身份验证登录的登录时间。 在连接池的环境中,影响通常较低,但在没有池的情况下或登录延迟受到密切监视的情况可能更明显。

没有 LOGIN

指定不应将用户映射到现有登录名。

CERTIFICATE cert_name

适用于:SQL Server 2008(10.0.x)及更高版本,SQL 数据库,Microsoft Fabric 中的 SQL 数据库

指定要为其创建数据库用户的证书。

ASYMMETRIC KEY asym_key_name

适用于:SQL Server 2008(10.0.x)及更高版本,SQL 数据库,Microsoft Fabric 中的 SQL 数据库

指定要为其创建数据库用户的非对称密钥。

DEFAULT_LANGUAGE = { NONE | <lcid> | <language name> | <language salias> }

适用于:SQL Server 2012(11.x)及以后版本,SQL 数据库

为新用户指定默认语言。 如果你为用户指定了默认语言,后来又更改了数据库的默认语言,用户的默认语言依然保持原样。 如果你没有指定默认语言,用户会获得数据库的默认语言。 如果你没有为用户指定默认语言,之后更改数据库的默认语言,用户的默认语言就会变成新的默认语言。

Important

DEFAULT_LANGUAGE 仅用于包含的数据库用户。

SID = sid

适用于:SQL Server 2012(11.x)及以后版本,以及 Microsoft Fabric 中的 SQL 数据库。

在SQL Server 2012(11.x)及以后版本中,仅适用于在包含数据库中拥有密码(SQL Server认证)的用户。 指定新数据库用户的 SID。 如果你没有选择这个选项,SQL Server 会自动分配一个 SID。 使用 SID 参数在具有同一标识 (SID) 的多个数据库中创建用户。 该功能在创建多个数据库用户以准备“始终在线”故障切换时非常有用。 要确定用户的SID,查询 sys.database_principals。

在 Microsoft Fabric 中的 SQL 数据库中, sid 应是指定Microsoft Entra 主体的有效 ID。 如果主体是用户或组,ID 应为该用户或组的 Microsoft Entra 对象 ID。 如果 Microsoft Entra 主体是服务主体(应用程序或托管身份),那么 ID 应为应用 ID 或客户端 ID。 指定的 ID 必须是一个 binary(16) 值。 数据库引擎不会验证 Microsoft Entra 中的指定 ID。 如果你使用该论证, SID 必须包含 TYPE。

TYPE = [ E |X ]

适用于:Microsoft Fabric 和 Azure SQL 数据库中的 SQL 数据库。

指定 Microsoft Entra 主体的类型。 E 指示主体是用户或服务主体(应用程序或托管标识)。 X 指示主体是一个组。

ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON |OFF ]

适用于:SQL Server 2016(13.x)及以后版本,SQL 数据库。

取消在大容量复制操作期间对服务器进行加密元数据检查。 这使用户能够在表或数据库之间大容量复制加密数据,而无需对数据进行解密。 默认为 OFF。

Warning

错误使用此选项可能导致数据损坏。 有关详细信息,请参阅迁移通过 Always Encrypted 保护的敏感数据。

来自外部提供者

适用于:SQL Server 2022(16.x)及以后版本,SQL Database,Azure SQL 托管实例,Microsoft Fabric 中的 SQL 数据库

指定主体用于Microsoft Entra 身份验证。 SQL Server 自动验证Microsoft Entra 中提供的主体名称。

如果发布声明CREATE USER的主体是 Microsoft Entra 用户主体,主体或主体的组必须在 Microsoft Entra 中处于目录阅读者角色。

在SQL 数据库和Azure SQL 托管实例中,如果发出语句的CREATE USER主体是服务主体,则数据库服务器或托管实例的标识必须位于Microsoft Entra 中的目录读取者角色中。

在 Microsoft Fabric 的 SQL 数据库中,你不能使用FROM EXTERNAL PROVIDER如果 Microsoft Entra 中的主体CREATE USER是服务主体。 服务主体必须使用 TYPE 和 SID 参数为 Microsoft Entra 主体创建用户。

其中 OBJECT_ID = “objectid”

适用于:SQL Server 2025(17.x)及更高版本,SQL Database,Azure SQL 托管实例,Microsoft Fabric 中的 SQL 数据库

指定 Microsoft Entra 对象 ID。 如果你指定了 OBJECT_ID,可以 user_name 是由原始主显示名加上后缀组成的用户自定义别名。 user_name必须是视图中的唯一名称 sys.database_principals ,并遵守所有其他 sysname 限制。 有关使用该WITH OBJECT_ID选项的更多信息,请参见 Microsoft Entra 登录和非唯一显示名称用户。

Note

从 SQL Server 2025(17.x)起, WITH OBJECT_ID 支持该选项适用于 Microsoft Entra 登录和拥有独特显示名称的用户。

如果服务主体显示名不是重复的,使用默认 CREATE LOGIN 的 or 语 CREATE USER 句。 扩展 WITH OBJECT_ID 是实现的故障排除修复项,用于非统一服务主体。 不建议将它与唯一的服务主体一起使用。 WITH OBJECT_ID对服务主体使用扩展而不成功添加后缀运行,但登录名或用户创建的服务主体并不明显。 建议通过使用后缀创建一个别名,以唯一标识服务主体。

Remarks

如果你省略FOR LOGIN了 ,新的数据库用户会映射到同名的 SQL Server 登录。

默认模式是服务器在解析该数据库用户对象名称时搜索的第一个模式。 除非另有指定,否则默认架构是此数据库用户创建的对象所有者。

如果用户有默认模式,服务器会使用该默认模式。 如果用户没有默认模式,但属于拥有默认模式的组,服务器则使用该组的默认模式。 如果用户没有默认模式且属于多个组,服务器会使用Windows组principal_id中最低的默认模式,这些组的默认模式是明确设置的。 你不能明确选择默认模式中的一个作为首选模式。 如果服务器无法确定用户的默认模式,就使用该 dbo 模式。

你可以在创建它指向的模式之前设置 DEFAULT_SCHEMA 好。

创建映射到证书或非对称键的用户时,你无法指定 DEFAULT_SCHEMA 。

如果用户是固定服务器角色的成员sysadmin,服务器会忽略 的DEFAULT_SCHEMA值。 所有固定服务器角色的 sysadmin 成员默认模式为 dbo。

该 WITHOUT LOGIN 条款创建了一个用户,但该用户没有映射到经过 SQL 认证的登录。 它可以作为 guest 连接到其他数据库。 你可以在没有登录的情况下给这个用户分配权限。 当安全上下文切换到未登录用户时,原始用户将获得该用户的权限,无需登录。 举例请参见 D. 创建和使用用户而无需登录。

只有映射到 Windows 主体的用户才能包含反斜杠字符 ( \ )。

你不能用 CREATE USER 来创建访客用户,因为访客用户已经存在于每个数据库中。 您可以通过授予 CONNECT 访客用户权限来启用,如图所示:

GRANT CONNECT TO guest; 
GO  

您可以在 sys.database_principals 目录视图中查看数据库用户的信息。

使用语法扩展FROM EXTERNAL PROVIDER在 Azure SQL 数据库 和 Azure SQL 托管实例 中创建服务器级Microsoft Entra 登录名。 通过使用 Microsoft Entra 登录,你可以将数据库级别的 Microsoft Entra 主体映射到服务器级的 Microsoft Entra 登录。 要从Microsoft Entra登录创建Microsoft Entra用户,请使用以下语法:

CREATE USER [Microsoft_Entra_principal] FROM LOGIN [Microsoft Entra login];

当你在Azure SQL数据库中创建用户时,login_name必须对应已有的Microsoft Entra登录。 否则,使用该FROM EXTERNAL PROVIDER条款只会创建一个没有数据库登录master的 Microsoft Entra 用户。 例如,以下命令创建包含用户:

CREATE USER [test@contoso.com] FROM EXTERNAL PROVIDER;

句法总结

基于登录名的用户 master

下面的列表显示基于登录名的用户的可能语法。 未列出默认架构选项。

  • CREATE USER [Domain1\WindowsUserTest]
  • CREATE USER [Domain1\WindowsUserTest] FOR LOGIN Domain1\WindowsUserTest
  • CREATE USER [Domain1\WindowsUserTest] FROM LOGIN Domain1\WindowsUserTest
  • CREATE USER [Domain1\WindowsGroupManagers]
  • CREATE USER [Domain1\WindowsGroupManagers] FOR LOGIN [Domain1\WindowsGroupManagers]
  • CREATE USER [Domain1\WindowsGroupManagers] FROM LOGIN [Domain1\WindowsGroupManagers]
  • CREATE USER SQLAUTHLOGIN
  • CREATE USER SQLAUTHLOGIN FOR LOGIN SQLAUTHLOGIN
  • CREATE USER SQLAUTHLOGIN FROM LOGIN SQLAUTHLOGIN

在数据库中进行身份验证的用户

下面的列表显示只能在包含数据库中使用的用户的可能语法。 创建的用户将不与 master 数据库中的任何登录名相关。 未列出默认架构和语言选项。

Important

此语法授予用户对数据库的访问权限,并且还将授予对数据库引擎的新访问权限。

  • CREATE USER [Domain1\WindowsUserTest]
  • CREATE USER [Domain1\WindowsGroupManagers]
  • CREATE USER Test WITH PASSWORD = '<strong password>'

基于没有系统数据库中登录名的 Windows 主体的用户master

以下列表显示了通过 Windows 组访问数据库引擎但系统数据库中没有登录master名的用户的可能语法。 此语法可用于所有类型的数据库中。 未列出默认架构和语言选项。

此语法类似于基于登录名的用户 master,但此类别的用户没有登录名 master。 该用户必须可以通过 Windows 组登录名访问数据库引擎。

此语法类似于基于 Windows 主体的包含的数据库用户,但此用户类别未获得对数据库引擎的新访问权限。

  • CREATE USER [Domain1\WindowsUserTest]
  • CREATE USER [Domain1\WindowsUserTest] FOR LOGIN Domain1\WindowsUserTest
  • CREATE USER [Domain1\WindowsUserTest] FROM LOGIN Domain1\WindowsUserTest
  • CREATE USER [Domain1\WindowsGroupManagers]
  • CREATE USER [Domain1\WindowsGroupManagers] FOR LOGIN [Domain1\WindowsGroupManagers]
  • CREATE USER [Domain1\WindowsGroupManagers] FROM LOGIN [Domain1\WindowsGroupManagers]

不能进行身份验证的用户

以下列表显示了无法登录到 SQL Server 的用户的可能语法。

  • CREATE USER RIGHTSHOLDER WITHOUT LOGIN
  • CREATE USER CERTUSER FOR CERTIFICATE SpecialCert
  • CREATE USER CERTUSER FROM CERTIFICATE SpecialCert
  • CREATE USER KEYUSER FOR ASYMMETRIC KEY SecureKey
  • CREATE USER KEYUSER FROM ASYMMETRIC KEY SecureKey

安全性

创建用户会授予对数据库的访问权限,但不会自动授予对数据库中对象的任何访问权限。 创建用户后,常见操作是将用户添加到有权访问数据库对象的数据库角色中或向用户授予对象权限。 有关设计权限系统的信息,请参阅 Getting Started with 数据库引擎 Permissions。

包含数据库的特殊注意事项

连接到包含的数据库时,如果用户在数据库中没有登录名master,则连接字符串必须包含包含的数据库名称作为初始目录。 拥有密码的包含数据库用户始终需要使用初始目录参数。

在包含数据库中,创建用户有助于将数据库与数据库引擎实例分离,以便可以轻松地将数据库移动到其他 SQL Server 实例中。 有关详细信息,请参阅包含的数据库和包含的数据库用户 - 使你的数据库可移植。 要将数据库用户从基于SQL认证登录的用户更改为包含的数据库用户并带密码,请参见 sp_migrate_user_to_contained(Transact-SQL)。

在包含数据库中,用户不必在 master 数据库中具有登录名。 数据库引擎管理员应该了解,可在数据库级别而非数据库引擎级别授予对包含数据库的访问权限。 有关详细信息,请参阅 Security Best Practices with Contained Databases。

对 Azure SQL 数据库使用包含的数据库用户时,使用数据库级别防火墙规则(而不服务器级别防火墙规则)配置访问权限。 有关详细信息,请参阅 sp_set_database_firewall_rule(Azure SQL 数据库)。

对于SQL Server 2022(16.x)、Azure SQL 数据库、Azure SQL 托管实例和Azure Synapse Analytics包含数据库用户,SSMS支持多因素认证。 有关详细信息,请参阅使用 Microsoft Entra 多重身份验证。

Permissions

需要对数据库具有 ALTER ANY USER 权限。

SQL Server 2022及更高版本的权限

需要对数据库拥有 CREATE USER 权限。

Examples

A. 基于 SQL Server 登录创建数据库用户

以下示例首先在数据库中创建一个名为 testmaster SQL Server 的登录,然后在 中创建一个对应的数据库用户testAdventureWorks2025。

--Connect to the master database
CREATE LOGIN test   
    WITH PASSWORD = '<strong password>';  

更改为用户数据库。 例如,在 SQL Server 中使用 USE [AdventureWorks2022] 语句。 在 Azure SQL 数据库 中,USE该语句不可用。 相反,直接连接到目标数据库,运行剩余的代码样本。 这个基于登录的例子不适用于 Microsoft Fabric 中的 SQL 数据库,因为它不支持基于登录的用户或登录。

--Connect to a user database
CREATE USER test FOR LOGIN test;
GO   

B. 创建一个带有默认模式的数据库用户

以下示例首先创建一个名为 testlogin 服务器的登录,并用你提供的密码,然后创建一个对应的数据库用户 testuser,默认模式 Marketing为 。

--Connect to the master database
CREATE LOGIN testlogin
    WITH PASSWORD = '<strong password>';  

更改为用户数据库。 例如,在 SQL Server 中使用 USE [AdventureWorks2022] 语句。 在 Azure SQL 数据库 和 Microsoft Fabric 中的 SQL 数据库中,该USE语句不可用。 相反,直接连接到目标数据库,运行剩余的代码样本。

--Connect to a user database
CREATE USER testuser FOR LOGIN testlogin
    WITH DEFAULT_SCHEMA = Marketing;  

C. 从证书创建数据库用户

下面的示例从证书 test 创建数据库用户 Contoso_Cert。 有关详细信息,请参阅CREATE CERTIFICATE(Transact-SQL)。

USE AdventureWorks2022;  
CREATE CERTIFICATE Contoso_Cert  
    ENCRYPTION BY PASSWORD = '<strong password>'  
    WITH SUBJECT = 'Contoso Facility Supervisors',
    EXPIRY_DATE = '11/11/2011';  
GO  
CREATE USER test FOR CERTIFICATE Contoso_Cert;  
GO   

D. 创建并使用无登录用户

以下示例创建一个数据库用户 CustomApp,该用户不映射到 SQL Server 登录名。 然后,该示例向用户 adventure-works\test 授予相应的权限以便模拟 CustomApp 用户。

USE AdventureWorks2022;  
CREATE USER CustomApp WITHOUT LOGIN ;  
GRANT IMPERSONATE ON USER::CustomApp TO [adventure-works\test] ;  
GO

为了使用 CustomApp 凭据,用户 adventure-works\test 执行以下语句。

EXECUTE AS USER = 'CustomApp' ;  
GO  

为了恢复到 adventure-works\test 凭据,该用户执行以下语句。

REVERT ;  
GO  

E. 创建一个包含密码的数据库用户

下面的示例创建一个拥有密码的包含数据库用户。 你只能在包含的数据库中执行此示例。

这个例子在 SQL 数据库中如果移除 DEFAULT_LANGUAGE。

USE AdventureWorks2022;  
GO  
CREATE USER test  
WITH PASSWORD='<password>'
    , DEFAULT_LANGUAGE=[Brazilian]  
    , DEFAULT_SCHEMA=[dbo]  
GO   

F. 为域名登录创建一个包含的数据库用户

以下示例为名为 Contoso的域名中的登录test创建包含数据库用户。 你只能在包含的数据库中执行此示例。

USE AdventureWorks2022;
GO  
CREATE USER [Contoso\test] ;  
GO   

G. 创建一个包含在特定SID的数据库用户

以下示例创建一个名为 TestUser的 SQL Server 认证包含数据库用户 。 你只能在包含的数据库中执行此示例。

USE AdventureWorks2022;  
GO  
CREATE USER TestUser WITH PASSWORD = '<strong password>'  
, SID = 0x01050000000000090300000063FF0451A9E7664BA705B10E37DDC4B7;

H. 创建一个用户来复制加密数据

以下示例会创建一个用户,该用户可以将受 Always Encrypted 功能保护的数据从一组包含加密列的表复制到另一组具有加密列的表中(在相同或不同的数据库中)。 有关详细信息,请参阅迁移通过 Always Encrypted 保护的敏感数据。

适用于:SQL Server 2016(13.x)及以后版本,SQL 数据库。

CREATE USER [test]   
WITH   
      DEFAULT_SCHEMA = dbo  
    , ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = ON ;  

I. 在Azure SQL 数据库和Azure SQL 托管实例中,从Microsoft Entra登录创建一个Microsoft Entra用户

要从 Microsoft Entra 登录名创建 Microsoft Entra 用户,可以使用以下语法。

使用Microsoft Entra登录您的Azure SQL 数据库逻辑服务器或SQL 托管实例。 使用服务器管理员登录,或在 SQL 数据库中为该角色成员loginmanager,或在 SQL 托管实例 中获得sysadmin该角色的登录。

以下 T-SQL 脚本从登录test@contoso.com名创建Microsoft Entra 用户test@contoso.com。 这个登录是在示例 CREATE LOGIN 中创建的。

CREATE USER [test@contoso.com] FROM LOGIN [test@contoso.com];
GO

Important

从Microsoft Entra登录创建 a USER 时,将 user_name 指定login_nameLOGIN为 。

支持从Microsoft Entra 登录名创建Microsoft Entra 用户作为组。

CREATE USER [MS Entra group] FROM LOGIN [MS Entra group];

GO

还可以从组Microsoft Entra 登录名创建Microsoft Entra 用户。

CREATE USER [test@contoso.com] FROM LOGIN [MS Entra group];

GO

J. 从 Microsoft Entra 主体创建包含的数据库用户

以下语法在数据库中创建一个Microsoft Entra 用户 test@contoso.com,而无需关联的登录名 master。 数据库引擎验证指定的用户是否存在于 Microsoft Entra 中。

CREATE USER [test@contoso.com] FROM EXTERNAL PROVIDER;
GO

在 Microsoft Fabric 的 SQL 数据库中,你不能使用FROM EXTERNAL PROVIDER如果 Microsoft Entra 中的主体CREATE USER是服务主体。

K. 从 Microsoft Entra 主体创建包含的数据库用户,而无需验证

适用于:Microsoft Fabric 中的 SQL 数据库和 Azure SQL 数据库

本节中的示例为 Microsoft Entra 主体创建数据库用户,而无需验证 Microsoft Entra 中的主体名称。

以下 T-SQL 示例为名为 test@contoso.com 的 Microsoft Entra 用户创建数据库用户。 将新用户的 SID 替换为 <unique identifier sid> Microsoft Entra 用户的对象 ID。

DECLARE @principal_name SYSNAME = 'test@contoso.com';
DECLARE @objectId UNIQUEIDENTIFIER = '<unique identifier sid>'; -- user's object ID in Microsoft Entra

-- Convert the guid to the right type
DECLARE @castObjectId NVARCHAR(MAX) = CONVERT(VARCHAR(MAX), CONVERT (VARBINARY(16), @objectId), 1);

-- Construct command: CREATE USER [@principal_name] WITH SID = @castObjectId, TYPE = E;
DECLARE @cmd NVARCHAR(MAX) = N'CREATE USER [' + @principal_name + '] WITH SID = ' + @castObjectId + ', TYPE = E;'
EXEC (@cmd);

以下示例为名为 HRApp 的 Microsoft Entra 服务主体创建数据库用户。 将新用户的 SID 替换为 <unique identifier sid> Microsoft Entra 中服务主体的客户端 ID。

Note

在指定Microsoft Entra服务主体时,请使用客户端ID,而非对象ID,User-Assigned 管理身份(UAMI)或 System-Assigned 管理身份(SAMI)。

DECLARE @principal_name SYSNAME = 'HRApp';
DECLARE @clientId UNIQUEIDENTIFIER = '<unique identifier sid>'; -- principal's client ID in Microsoft Entra

-- Convert the guid to the right type
DECLARE @castClientId NVARCHAR(MAX) = CONVERT(VARCHAR(MAX), CONVERT (VARBINARY(16), @clientId), 1);

-- Construct command: CREATE USER [@principal_name] WITH SID = @castClientId, TYPE = E;
DECLARE @cmd NVARCHAR(MAX) = N'CREATE USER [' + @principal_name + '] WITH SID = ' + @castClientId + ', TYPE = E;'
EXEC (@cmd);

以下示例为名为 HR 的 Microsoft Entra 组创建数据库用户。 将新用户的 SID 替换为 <unique identifier sid> 组的对象 ID。

DECLARE @principal_name SYSNAME = 'HR';
DECLARE @objectId UNIQUEIDENTIFIER = '<unique identifier sid>'; -- principal's object ID in Microsoft Entra

-- Convert the guid to the right type
DECLARE @castObjectId NVARCHAR(MAX) = CONVERT(VARCHAR(MAX), CONVERT (VARBINARY(16), @objectId), 1);

-- Construct command: CREATE USER [@principal_name] WITH SID = @castObjectId, TYPE = X;
DECLARE @cmd NVARCHAR(MAX) = N'CREATE USER [' + @principal_name + '] WITH SID = ' + @castObjectId + ', TYPE = X;'
EXEC (@cmd);