CREATE USER (Transact-SQL)

 

向当前数据库添加用户。有十一种类型的用户:

基于 master 数据库中登录名的用户 这是最常见的一种用户类型。

  • 基于 Windows 用户的登录名的用户。

  • 基于 Windows 组的登录名的用户。

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

在数据库中进行身份验证的用户 只能在包含数据库中使用。

  • 基于无登录名的 Windows 用户的用户。

  • 基于无登录名的 Windows 组的用户。

  • 拥有密码的包含数据库用户。

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

  • 基于无登录名但可通过 Windows 组中的成员身份连接到数据库引擎的 Windows 用户的用户。

  • 基于无登录名但可通过其他 Windows 组中的成员身份连接到数据库引擎的 Windows 组的用户。

无法进行身份验证的用户 这些用户无法登录 SQL Server 或 SQL Database。

  • 没有登录名的用户。不能登录,但可以被授予权限。

  • 基于证书的用户。不能登录,但可以被授予权限,也可以对模块进行签名。

  • 基于非对称密钥的用户。不能登录,但可以被授予权限,也可以对模块进行签名。

适用于:SQL Server(SQL Server 2008 至当前版本)、Azure SQL Database、SQL 数据库 V12、(在某些区域中提供预览版)。

主题链接图标Transact-SQL 语法约定

语法

          -- SQL Server Syntax

          -- Users based on logins in master
CREATE USER user_name 
    [ 
        { FOR | FROM } LOGIN login_name 
    ]
    [ WITH DEFAULT_SCHEMA = schema_name ] 
[ ; ]

-- Users that authenticate at the database (SQL Database Update (Preview) can use most options)
CREATE USER 
    {
      windows_principal [ WITH <options_list> [ ,... ] ]
    | user_name WITH PASSWORD = 'password' [ , <options_list> [ ,... ] 
    }
 [ ; ]

-- 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 DEFAULT_SCHEMA = schema_name ] 
[ ; ]

-- 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 
    }
 [ ; ]

<options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | DEFAULT_LANGUAGE = { NONE | lcid | language name | language alias }
    | SID = sid
          -- Windows Azure SQL Database
CREATE USER user_name
    [ { { FOR | FROM }
      { 
        LOGIN login_name 
      } 
      | WITHOUT LOGIN
      }
    ] 
    [ WITH DEFAULT_SCHEMA = schema_name ] 
[;]

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

参数

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

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

    如果 CREATE USER 语句是 SQL 批处理中唯一的语句,则 Windows Azure SQL Database 将支持 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>]。有关示例,请参阅语法摘要。

  • WITH PASSWORD = 'password'

    适用范围:SQL Server 2012 到 SQL Server 2014,SQL 数据库 V12。

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

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

  • 证书 cert_name

    适用范围:SQL Server 2008 到 SQL Server 2014,SQL 数据库 V12。

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

  • ASYMMETRIC KEY asym_key_name

    适用范围:SQL Server 2008 到 SQL Server 2014,SQL 数据库 V12。

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

  • DEFAULT_LANGUAGE = { NONE | <lcid> | <language name> | <language alias> }

    适用范围:SQL Server 2012 到 SQL Server 2014,SQL 数据库 V12。

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

    重要

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

  • SID = sid

    适用范围:SQL Server 2012 到 SQL Server 2014。

    仅适用于包含数据库中具有密码的用户(SQL Server 身份验证)。指定新数据库用户的 SID。如果未选择此选项,则 SQL Server 自动指派 SID。使用 SID 参数在具有同一标识 (SID) 的多个数据库中创建用户。当在多个数据库中创建用户以准备进行 AlwaysOn 故障转移时,这非常有用。要确定用户的 SID,请查询 sys.database_principals。

备注

如果已忽略 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 用户,因为每个数据库中均已存在 guest 用户。可通过向 guest 用户授予 CONNECT 权限来启用该用户,如下所示:

GRANT CONNECT TO guest;
GO

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

语法摘要

基于 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 数据库中的任何登录名相关。未列出默认架构和语言选项。

System_CAPS_security 安全性注意

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

  • CREATE USER [Domain1\WindowsUserBarry]

  • CREATE USER [Domain1\WindowsGroupManagers]

  • CREATE USER Barry WITH PASSWORD = 'sdjklalie8rew8337!$d'

基于在 master 数据库中无登录名的 Windows 主体的用户

下面的列表显示可通过 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

安全性

创建用户会授予对数据库的访问权限,但不会自动授予对数据库中对象的任何访问权限。创建用户后,常见操作是将用户添加到有权访问数据库对象的数据库角色中或向用户授予对象权限。

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

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

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

在包含数据库中,用户不必在 master 数据库中具有登录名。数据库引擎管理员应该了解,可在数据库级别而非数据库引擎级别授予对包含数据库的访问权限。有关详细信息,请参阅针对包含数据库的安全性最佳方法

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

权限

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

示例

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

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

CREATE LOGIN AbolrousHazem 
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';
USE AdventureWorks2012;
GO
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;
GO 

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

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

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

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

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

适用范围:SQL Server 2008 到 SQL Server 2014。

USE AdventureWorks2012;
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 AdventureWorks2012 ;
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 到 SQL Server 2014。如果删除了 DEFAULT_LANGUAGE,则此示例可在 SQL 数据库 V12 中正常运行。

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

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

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

适用范围:SQL Server 2012 到 SQL Server 2014。

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

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

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

适用范围:SQL Server 2012 到 SQL Server 2014。

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

请参阅

创建数据库用户
sys.database_principals (Transact-SQL)
ALTER USER (Transact-SQL)
DROP USER (Transact-SQL)
CREATE LOGIN (Transact-SQL)
EVENTDATA (Transact-SQL)
包含的数据库