CREATE USER (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric SQL 数据库

向当前数据库添加用户。 列出了 13 种类型的用户,其中包含最基本的语法示例:

注意

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

基于登录名的用户 master

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

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

  • 基于使用 SQL Server 身份验证的登录名的用户。 CREATE USER Mary;

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

    注意

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

    注意

    Microsoft Fabric 中的 SQL 数据库中不支持基于登录名的登录名,因此不支持登录名。

在数据库中进行身份验证的用户 - 建议用来帮助提高数据库的可移植性。
在 SQL 数据库中始终允许。 在 SQL Server 中,只能用于包含的数据库。

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

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

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

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

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

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

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

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

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

Transact-SQL 语法约定

语法

适用于 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 中 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 }

并行数据仓库的语法

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

参数

user_name

指定在此数据库中用于识别该用户的名称。 user_namesysname。 它的长度最多是 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

适用于:Microsoft Fabric 中的 SQL 数据库、SQL 托管实例、Azure Synapse Analytics、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 [bob@contoso.com] FROM EXTERNAL PROVIDER;
    • CREATE USER [alice@fabrikam.onmicrosoft.com] FROM EXTERNAL PROVIDER;
  • Microsoft Entra 服务器主体(登录名) 引入了创建映射到虚拟 master 数据库中Microsoft Entra 登录名的用户。 例如: CREATE USER [bob@contoso.com] FROM LOGIN [bob@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 数据库

WITH PASSWORD = 'password'

适用于:SQL Server 2012 (11.x) 及更高版本、SQL 数据库。

只能在包含数据库中使用。 为正在创建的用户指定密码。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

WITHOUT 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 数据库

为新用户指定默认语言。 如果为用户指定了默认语言并在之后更改数据库的默认语言,则用户的默认语言仍会保留为指定的语言。 如果未指定默认语言,用户的默认语言将为数据库的默认语言。 如果未指定用户的默认语言并在之后更改数据库的默认语言,用户的默认语言将更改为数据库的新默认语言。

重要

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) 的多个数据库中创建用户。 当在多个数据库中创建用户以准备进行 Always On 故障转移时,这非常有用。 若要确定用户的 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 中的 SQL 数据库。

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

ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON | OFF ]

适用于:SQL Server 2016 (13.x) 及更高版本、SQL 数据库。

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

警告

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

FROM EXTERNAL PROVIDER

适用于:Microsoft Fabric 中的 SQL 数据库、Azure SQL 托管实例、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则不允许使用。 服务主体必须使用 TYPESID 参数为 Microsoft Entra 主体创建用户。

WITH OBJECT_ID = 'objectid'

适用于:Microsoft Fabric 中的 SQL 数据库、Azure SQL 托管实例、SQL 数据库

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

注意

如果服务主体显示名称不是重复的名称,则应使用默认的 CREATE LOGINCREATE USER 语句。 扩展 WITH OBJECT_ID 是实现的故障排除修复项,用于非统一服务主体。 服务主体唯一时,不建议使用它。 将 WITH OBJECT_ID 扩展用于服务主体而不添加后缀将成功运行,但是为哪个服务主体创建登录名或用户并不明显。 建议使用后缀创建别名,以唯一标识服务主体。 SQL Server 不支持 WITH OBJECT_ID 扩展。

注解

如果 FOR LOGIN 省略,新数据库用户将映射到具有相同名称的 SQL Server 登录名。

默认架构将是服务器为此数据库用户解析对象名时将搜索的第一个架构。 除非另外指定,否则默认架构将是此数据库用户创建的对象所属的架构。

如果用户具有默认架构,则将使用默认架构。 如果用户不具有默认架构,但该用户是具有默认架构的组的成员,则将使用该组的默认架构。 如果用户不具有默认架构而且是多个组的成员,则该用户的默认架构将是具有最低 principle_id 的 Windows 组的架构和一个显式设置的默认架构。 (不可能将可用的默认架构之一显式选作首选架构。)如果不能为用户确定默认架构,将使用 dbo 架构。

DEFAULT_SCHEMA 可在创建它所指向的架构前进行设置。

在创建映射到证书或非对称密钥的用户时,不能指定 DEFAULT_SCHEMA。

如果用户是 sysadmin 固定服务器角色的成员,则忽略 DEFAULT_SCHEMA 的值。 sysadmin 固定服务器角色的所有成员都有默认架构 dbo

WITHOUT LOGIN 子句可创建不映射到 SQL Server 登录名的用户。 它可以作为 guest 连接到其他数据库。 可以在没有登录名的情况下将权限分配给此用户,当安全上下文更改为没有登录名的用户时,原始用户将接收没有登录名的用户的权限。 请参阅示例 D. 创建和使用不含登录名的用户

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

不能使用 CREATE USER 创建来宾用户,因为每个数据库中均已存在来宾用户。 可通过授予 guest 用户 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 [bob@contoso.com] FROM EXTERNAL PROVIDER;

语法摘要

基于登录名的用户 master

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

  • CREATE USER [Domain1\WindowsUserBarry]
  • CREATE USER [Domain1\WindowsUserBarry] FOR LOGIN Domain1\WindowsUserBarry
  • CREATE USER [Domain1\WindowsUserBarry] FROM LOGIN Domain1\WindowsUserBarry
  • 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 数据库中的任何登录名相关。 未列出默认架构和语言选项。

重要

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

  • CREATE USER [Domain1\WindowsUserBarry]
  • CREATE USER [Domain1\WindowsGroupManagers]
  • CREATE USER Barry WITH PASSWORD = 'sdjklalie8rew8337!$d'

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

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

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

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

  • CREATE USER [Domain1\WindowsUserBarry]
  • CREATE USER [Domain1\WindowsUserBarry] FOR LOGIN Domain1\WindowsUserBarry
  • CREATE USER [Domain1\WindowsUserBarry] FROM LOGIN Domain1\WindowsUserBarry
  • 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 Database Engine Permissions

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

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

在包含数据库中,创建用户有助于将数据库与数据库引擎实例分离,以便可以轻松地将数据库移动到其他 SQL Server 实例中。 有关详细信息,请参阅包含的数据库包含的数据库用户 - 使你的数据库可移植。 若要将数据库用户从基于 SQL Server 身份验证登录名的用户更改为拥有密码的包含数据库用户,请参阅 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)、SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics 包含的数据库用户,SSMS 支持多重身份验证。 有关详细信息,请参阅使用 Microsoft Entra 多重身份验证

权限

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

SQL Server 2022 及更高版本的权限

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

示例

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

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

CREATE LOGIN AbolrousHazem   
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';  

更改为用户数据库。 例如,在 SQL Server 中使用 USE AdventureWorks2022 语句。 在 Azure Synapse Analytics 和 Analytics Platform System (PDW) 中,必须与用户数据库建立新的连接。

CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;  
GO   

B. 创建具有默认架构的数据库用户

下面的示例首先创建名为 WanidaBenshoof 且具有密码的服务器登录名,然后创建具有默认架构 Wanida 的对应数据库用户 Marketing

CREATE LOGIN WanidaBenshoof   
    WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';  
USE AdventureWorks2022;  
CREATE USER Wanida FOR LOGIN WanidaBenshoof   
    WITH DEFAULT_SCHEMA = Marketing;  
GO  

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

下面的示例从证书 JinghaoLiu 创建数据库用户 CarnationProduction50

适用于:SQL Server 2008 (10.0.x) 及更高版本。

USE AdventureWorks2022;  
CREATE CERTIFICATE CarnationProduction50  
    WITH SUBJECT = 'Carnation Production Facility Supervisors',  
    EXPIRY_DATE = '11/11/2011';  
GO  
CREATE USER JinghaoLiu FOR CERTIFICATE CarnationProduction50;  
GO   

D. 创建和使用不含登录名的用户

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

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

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

EXECUTE AS USER = 'CustomApp' ;  
GO  

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

REVERT ;  
GO  

E. 创建拥有密码的包含数据库用户

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

适用于:SQL Server 2012 (11.x) 及更高版本。 如果删除了 DEFAULT_LANGUAGE,则此示例可在 SQL 数据库中正常运行。

USE AdventureWorks2022;  
GO  
CREATE USER Carlo  
WITH PASSWORD='RN92piTCh%$!~3K9844 Bl*'  
    , DEFAULT_LANGUAGE=[Brazilian]  
    , DEFAULT_SCHEMA=[dbo]  
GO   

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

下面的示例为 Contoso 域中名为 Fritz 的登录名创建一个包含数据库用户。 该示例只能在包含数据库中执行。

适用于:SQL Server 2012 (11.x) 及更高版本。

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

G. 创建具有特定 SID 的包含数据库用户

下面的示例创建名为 CarmenW 的 SQL Server 经过身份验证的包含数据库用户。 该示例只能在包含数据库中执行。

适用于:SQL Server 2012 (11.x) 及更高版本。

USE AdventureWorks2022;  
GO  
CREATE USER CarmenW WITH PASSWORD = 'a8ea v*(Rd##+'  
, SID = 0x01050000000000090300000063FF0451A9E7664BA705B10E37DDC4B7;

H. 创建用户以复制加密数据

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

适用于:SQL Server 2016 (13.x) 及更高版本、SQL 数据库。

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

I. 从 Azure SQL 中的 Microsoft Entra 登录名创建 Microsoft Entra 用户

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

使用Microsoft Entra 登录名登录到 Azure 中的逻辑服务器或SQL 托管实例,该登录名授予sysadmin了SQL 托管实例角色或loginmanagerSQL 数据库中的角色。 以下 T-SQL 脚本从登录bob@contoso.com名创建Microsoft Entra 用户bob@contoso.com。 此登录名是在 CREATE LOGIN 示例中创建的。

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

重要

从 Microsoft Entra 登录名创建 USER 时,请将user_name指定为 LOGIN 中的相同login_name

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

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

GO

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

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

GO

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

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

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

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

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

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

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

DECLARE @principal_name SYSNAME = 'bob@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。

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 @group_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 [@groupName] WITH SID = @castObjectId, TYPE = X;
DECLARE @cmd NVARCHAR(MAX) = N'CREATE USER [' + @principal_name + '] WITH SID = ' + @castObjectId + ', TYPE = X;'
EXEC (@cmd);

后续步骤

创建用户后,便可考虑使用 ALTER ROLE 语句将用户添加到某个数据库角色。
你可能还想对该角色 GRANT 对象权限,以便它能访问表。 有关 SQL Server 安全模型的常规信息,请参阅权限