CREATE LOGIN (Transact-SQL)

为 SQL Server、Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics 或 Analytics Platform System 数据库创建登录名。 为特定版本的语法、参数、备注、权限和示例选择以下选项卡之一。

CREATE LOGIN 参与事务。 如果在事务内执行 CREATE LOGIN 并且该事务回滚,则登录名创建也会回滚。 如果在事务内执行,则在事务提交之前无法使用创建的登录名。

注意

Microsoft Entra ID 以前称为 Azure Active Directory(Azure AD)。

有关语法约定的详细信息,请参阅 Transact-SQL 语法约定

选择一个产品

在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。

* SQL Server *  

 

SQL Server

语法

-- Syntax for SQL Server
CREATE LOGIN login_name { WITH <option_list1> | FROM <sources> }

<option_list1> ::=
    PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ]
    [ , <option_list2> [ ,... ] ]

<option_list2> ::=
    SID = sid
    | DEFAULT_DATABASE = database
    | DEFAULT_LANGUAGE = language
    | CHECK_EXPIRATION = { ON | OFF}
    | CHECK_POLICY = { ON | OFF}
    | CREDENTIAL = credential_name

<sources> ::=
    WINDOWS [ WITH <windows_options>[ ,... ] ]
    | EXTERNAL PROVIDER
    | CERTIFICATE certname
    | ASYMMETRIC KEY asym_key_name

<windows_options> ::=
    DEFAULT_DATABASE = database
    | DEFAULT_LANGUAGE = language

参数

login_name

指定创建的登录名。 有五种类型的登录名:SQL Server 登录名、Windows 登录名、Microsoft Entra 登录名、证书映射登录名和非对称密钥映射登录名。

创建从 Windows 域帐户映射的登录名时,必须使用 [<domainName>\<login_name>] 格式的登录名。 UPN 不能采用 login_name@DomainName 格式。 有关示例,请参阅 本文后面的示例 E 。 身份验证登录是类型 sysname,必须符合标识符的规则,并且不能包含反斜杠()。 Windows 登录名可以包含“\”。 基于 Active Directory 用户的登录名限制为少于 21 个字符的名称。

使用 FROM EXTERNAL PROVIDER 子句时,登录名必须与 SQL 实例启用 Arc 的同一租户中现有 Microsoft Entra 主体的显示名称匹配。 Microsoft Entra 用户、组和应用程序可用于创建登录名。

PASSWORD ='password'

仅适用于 SQL Server 登录。 指定正在创建的登录名的密码。 请使用强密码。 有关详细信息,请参阅强密码密码策略。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

密码是区分大小写的。 密码应始终长度至少为 8 个字符,不能超过 128 个字符。 密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。 密码不能包含单引号或 login_name

PASSWORD =hashed_password

仅适用于 HASHED 关键字。 指定要创建的登录名的密码的哈希值。

HASHED

仅适用于 SQL Server 登录。 指定在 PASSWORD 参数后输入的密码已经过哈希运算。 如果未选择此选项,则输入为密码的字符串将经过哈希处理,然后再将其存储在数据库中。 此选项应仅用于在服务器之间迁移数据库。 不要使用 HASHED 选项创建新的登录名。 HASHED 选项不能与 SQL 7 或更早版本创建的哈希一起使用。

MUST_CHANGE

仅适用于 SQL Server 登录。 如果包括此选项,则 SQL Server 将在首次使用新登录时提示用户输入新密码。

CREDENTIAL =credential_name

将映射到新 SQL Server 登录的凭据名称。 该凭据必须已存在于服务器中。 当前此选项只将凭据链接到登录名。 凭据无法映射到 System 管理员istrator (sa) 登录名。

SID = sid

用于重新创建登录名。 仅适用于 SQL Server 身份验证登录,不适用于 Windows 身份验证登录。 指定新 SQL Server 身份验证登录的 SID。 如果未使用此选项,SQL Server 将自动分配 SID。 SID 结构取决于 SQL Server 版本。 SQL Server 登录 SID:基于 GUID 的 16 字节 (binary(16)) 文本值。 例如,SID = 0x14585E90117152449347750164BA00A7

DEFAULT_DATABASE =database

指定将指派给登录名的默认数据库。 如果未包含此选项,则默认数据库设置为 master。

DEFAULT_LANGUAGE =language

指定将指派给登录名的默认语言。 如果未包含此选项,则默认语言设置为服务器的当前默认语言。 即使将来服务器的默认语言发生更改,登录名的默认语言也仍保持不变。

CHECK_EXPIRATION = { ON | OFF }

仅适用于 SQL Server 登录。 指定是否应对此登录帐户强制实施密码过期策略。 默认值为 OFF。

CHECK_POLICY = { ON | OFF }

仅适用于 SQL Server 登录。 指定应对此登录强制实施运行 SQL Server 的计算机的 Windows 密码策略。 默认值为 ON。

如果 Windows 策略要求强密码,密码必须至少包含以下四个特点中的三个:

  • 大写字符 (A-Z)。
  • 小写字符 (a-z)。
  • 数字 (0-9)。
  • 非字母数字字符之一,例如空格、_、@、*、^、%、!、$、#或 &。

WINDOWS

指定将登录名映射到 Windows 登录名。

FROM EXTERNAL PROVIDER

指定登录名映射到 Microsoft Entra 主体。 此选项适用于已启用 Arc 的 SQL Server 2022 及更高版本。 有关详细信息,请参阅 适用于 SQL Server 的 Microsoft Entra 身份验证

CERTIFICATE certname

指定将与此登录名关联的证书名称。 此证书必须已存在于 master 数据库中。

ASYMMETRIC KEY asym_key_name

指定将与此登录名关联的非对称密钥的名称。 此密钥必须已存在于 master 数据库中。

备注

  • 密码是区分大小写的。
  • 仅当创建 SQL Server 登录名时,才支持预装密码。
  • 如果指定 MUST_CHANGE,则 CHECK_EXPIRATION 和 CHECK_POLICY 必须设置为 ON。 否则,该语句将失败。
  • 不支持CHECK_POLICY = OFF 和 CHECK_EXPIRATION = ON 的组合。
  • 如果 CHECK_POLICY 设置为 OFF,将对 lockout_time 进行重置,并将 CHECK_EXPIRATION 设置为 OFF。

重要

只有在 Windows Server 2003 及更高版本上才会强制执行 CHECK_EXPIRATION 和 CHECK_POLICY。 有关详细信息,请参阅 Password Policy

权限

  • 只有具有针对服务器的 ALTER ANY LOGIN 权限或 securityadmin 固定服务器角色的成员身份的用户才可创建登录 。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE
  • 如果使用 CREDENTIAL 选项,则还需要对此服务器的 ALTER ANY CREDENTIAL 权限 。

SQL Server 2022 及更高版本的权限

要求对服务器具有 CREATE LOGIN 权限或 ##MS_LoginManager## 固定服务器角色的成员身份。

创建登录后

创建登录后,该登录可以连接到 SQL Server,但是只具有授予 public 角色的权限。 考虑执行以下部分活动。

  • 要连接到数据库,请创建登录名对应的数据库用户。 有关详细信息,请参阅 CREATE USER
  • 使用 CREATE SERVER ROLE 创建用户定义的服务器角色。 使用 ALTER SERVER ROLE ...ADD MEMBER 将新登录名添加到用户定义的服务器角色。 有关详细信息,请参阅 CREATE SERVER ROLEALTER SERVER ROLE
  • 使用 sp_addsrvrolemember 将登录名添加到固定服务器角色。 有关详细信息,请参阅服务器级别角色sp_addsrvrolemember
  • 使用 GRANT 语句将服务器级别权限授予新的登录名或包含该登录名的角色。 有关详细信息,请参阅 GRANT

示例

A. 创建带密码的登录名

以下示例为特定用户创建登录名并分配密码。

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';
GO

B. 创建带必须更改的密码的登录名

以下示例为特定用户创建登录名并分配密码。 MUST_CHANGE 选项要求用户在首次连接服务器时更改此密码。

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

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>'
    MUST_CHANGE, CHECK_EXPIRATION = ON;
GO

注意

当 CHECK_EXPIRATION 设为 OFF (关)时,不能使用 MUST_CHANGE 选项。

C. 创建映射到凭据的登录名

以下示例使用该用户为特定用户创建登录名。 此登录名映射到凭据。

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

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>',
    CREDENTIAL = <credentialName>;
GO

D. 从证书创建登录名

下例用 master 中的证书为特定用户创建登录名。

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

USE MASTER;
CREATE CERTIFICATE <certificateName>
    WITH SUBJECT = '<login_name> certificate in master database',
    EXPIRY_DATE = '12/05/2025';
GO
CREATE LOGIN <login_name> FROM CERTIFICATE <certificateName>;
GO

E. 从 Windows 域帐户创建登录名

以下示例使用 Windows 域帐户创建一个登录名。

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

CREATE LOGIN [<domainName>\<login_name>] FROM WINDOWS;
GO

F. 从 SID 创建登录名

以下示例首先创建 SQL Server 身份验证登录,并确定该登录的 SID。

CREATE LOGIN TestLogin WITH PASSWORD = 'SuperSecret52&&';
SELECT name, sid FROM sys.sql_logins WHERE name = 'TestLogin';
GO

我的查询返回 0x241C11948AEEB749B0D22646DB1A19F2 作为 SID。 你的查询将返回不同的值。 以下语句将删除登录名,然后重新创建登录名。 使用前面的查询中的 SID。

DROP LOGIN TestLogin;
GO

CREATE LOGIN TestLogin
WITH PASSWORD = 'SuperSecret52&&', SID = 0x241C11948AEEB749B0D22646DB1A19F2;

SELECT * FROM sys.sql_logins WHERE name = 'TestLogin';
GO

G. 创建具有多个参数的登录名

下面的示例演示如何在每个参数之间使用逗号将多个参数串在一起。

CREATE LOGIN [MyUser]
WITH PASSWORD = 'MyPassword',
DEFAULT_DATABASE = MyDatabase,
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF ;

H. 创建具有哈希密码的 SQL 登录名

下面的示例展示了如何创建具有与迁移方案中现有登录名相同的密码的 SQL 登录名。 第一步是从源数据库服务器上的现有登录名中检索密码哈希。 然后,使用相同的哈希在新的数据库服务器上创建登录名。 通过这样做,新的登录名将具有与旧服务器相同的密码。

-- run this to retrieve the password hash for an individual Login:
SELECT LOGINPROPERTY('Andreas','PASSWORDHASH') AS password_hash;
-- as an alternative, the catalog view sys.sql_logins can be used to retrieve the password hashes for multiple accounts at once. (This could be used to create a dynamic sql statemnt from the result set)
SELECT name, password_hash
FROM sys.sql_logins
  WHERE
    principal_id > 1    -- excluding sa
    AND
    name NOT LIKE '##MS_%##' -- excluding special MS system accounts
-- create the new SQL Login on the new database server using the hash of the source server
CREATE LOGIN Andreas
  WITH PASSWORD = 0x02000A1A89CD6C6E4C8B30A282354C8EA0860719D5D3AD05E0CAE1952A1C6107A4ED26BEBA2A13B12FAB5093B3CC2A1055910CC0F4B9686A358604E99BB9933C75B4EA48FDEA HASHED;

I. 为 Microsoft Entra 用户创建登录名

以下示例为 Microsoft Entra 帐户创建一个登录名,该帐户 joe@contoso.onmicrosoft.com 存在于名为 contoso 的 Microsoft Entra 租户中。

CREATE LOGIN [joe@contoso.onmicrosoft.com] FROM EXTERNAL PROVIDER

GO

J. 为联合 Microsoft Entra 帐户创建登录名

以下示例为名为 contoso 的租户中的联合 Microsoft Entra 帐户bob@contoso.com创建登录名。 用户 bob 也可以是来宾用户。

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

K. 为 Microsoft Entra 组创建登录名

以下示例为租户 contoso 中存在的 Microsoft Entra 组 mygroup 创建登录名。

CREATE LOGIN [mygroup] FROM EXTERNAL PROVIDER
GO

L. 为 Microsoft Entra 应用程序创建登录名

以下示例为租户 contoso 中存在的 Microsoft Entra 应用程序 myapp 创建登录名。

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER

* Azure SQL 数据库 *

 

SQL 数据库

语法

-- Syntax for Azure SQL Database
CREATE LOGIN login_name
  { 
    FROM EXTERNAL PROVIDER [WITH OBJECT_ID = 'objectid'] 
    | WITH <option_list> [,..] 
  }

<option_list> ::=
    PASSWORD = { 'password' }
    [ , SID = sid ]

参数

login_name

注意

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

FROM EXTERNAL PROVIDER 子句一起使用时,登录名指定 Microsoft Entra 主体,它可以是 Microsoft Entra 用户、组或应用程序。 否则,登录名表示所创建 SQL 登录名的名称。

不支持作为 2048 多个 Microsoft Entra 安全组的成员的 Microsoft Entra 用户和服务主体登录到 SQL 数据库、SQL 托管实例 或 Azure Synapse 中的数据库。

FROM EXTERNAL PROVIDER

指定登录名用于 Microsoft Entra 身份验证。

WITH OBJECT_ID = 'objectid'

指定 Microsoft Entra 对象 ID。 如果指定了 OBJECT_ID login_name,则不需要与 Microsoft Entra 显示名称匹配。 login_name必须是视图中的唯一名称 sys.server_principals ,并遵守所有其他 sysname 限制。 有关使用 WITH OBJECT_ID 选项的详细信息,请参阅 Microsoft Entra 登录名和具有非统一显示名称的用户。

注意

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

PASSWORD *='password'

指定正在创建的 SQL 登录的密码。 请使用强密码。 有关详细信息,请参阅强密码密码策略。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

密码是区分大小写的。 密码应始终长度至少为 8 个字符,不能超过 128 个字符。 密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。 密码不能包含单引号或 login_name

SID = sid

用于重新创建登录名。 仅适用于 SQL Server 身份验证登录,不适用于 Windows 身份验证登录。 指定新 SQL Server 身份验证登录的 SID。 如果未使用此选项,SQL Server 会自动分配 SID。 SID 结构取决于 SQL Server 版本。 对于 SQL 数据库,这是包含 0x01060000000000640000000000000000 的 32 字节 (binary(32)) 文本以及表示 GUID 的 16 个字节。 例如,SID = 0x0106000000000064000000000000000014585E90117152449347750164BA00A7

备注

  • 密码是区分大小写的。
  • 自动创建登录名将启用新的登录名,并授予它服务器级 CONNECT SQL 权限。

重要

有关在 Azure SQL 数据库中使用登录名和用户的信息,请参阅在 Azure SQL 数据库中管理登录名

登录

SQL 数据库登录名

CREATE LOGIN 语句必须是批中的唯一语句。

在连接到 SQL 数据库的一些方法(如 sqlcmd)中,必须使用 <login>@<server> 符号将 SQL 数据库服务器名称追加到连接字符串中的登录名之后。 例如,如果登录为 login1,SQL 数据库服务器的完全限定名称是 servername.database.windows.net,则连接字符串的 username 参数应是 login1@servername。 由于 username 参数的总长度为 128 个字符,因此,login_name 被限定为 127 个字符减去服务器名称的长度 。 在示例中,login_name 只能包含 117 个字符,因为 servername 包含 10 个字符。

在 SQL 数据库中,必须使用适当的权限连接到 master 数据库才能创建登录。 有关详细信息,请参阅创建其他登录名和具有管理权限的用户

SQL Server 规则允许你创建 <loginname>@<servername> 格式的 SQL Server 身份验证登录。 如果你的 SQL 数据库服务器是 myazureserver 并且登录名是 myemail@live.com,则必须提供 myemail@live.com@myazureserver 格式的登录名。

在 SQL 数据库中,对连接和服务器级别的防火墙规则进行身份验证时所需的登录数据会暂时缓存在每个数据库中。 此缓存定期刷新。 若要强制刷新身份验证缓存并确保数据库具有最新版本的登录表,请执行 DBCC FLUSHAUTHCACHE

权限

只有服务器级别主体登录(由预配过程创建)或 master 数据库中的 loginmanager 数据库角色成员可以创建新的登录。 有关详细信息,请参阅创建其他登录名和具有管理权限的用户

示例

A. 创建带密码的登录名

以下示例为特定用户创建登录名并分配密码。

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';
GO

B. 从 SID 创建登录名

以下示例首先创建 SQL Server 身份验证登录,并确定该登录的 SID。

CREATE LOGIN TestLogin WITH PASSWORD = 'SuperSecret52&&';

SELECT name, sid FROM sys.sql_logins WHERE name = 'TestLogin';
GO

我的查询返回 0x241C11948AEEB749B0D22646DB1A19F2 作为 SID。 你的查询将返回不同的值。 以下语句将删除登录名,然后重新创建登录名。 使用前面的查询中的 SID。

DROP LOGIN TestLogin;
GO

CREATE LOGIN TestLogin
WITH PASSWORD = 'SuperSecret52&&', SID = 0x241C11948AEEB749B0D22646DB1A19F2;

SELECT * FROM sys.sql_logins WHERE name = 'TestLogin';
GO

°C 使用 Microsoft Entra 帐户创建登录名

此示例使用 Microsoft Entra 域中contoso存在的用户的bob@contoso.com凭据在 Azure SQL 逻辑服务器中创建登录名。

Use master
CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
GO

D. 使用对象 ID 创建具有别名的登录名

可以通过指定 Microsoft Entra 服务主体或组的对象 ID 为 login_name 创建别名。

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID='4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx' 

有关获取服务主体的对象 ID 的详细信息,请参阅 服务主体对象

* Azure SQL
托管实例 *

 

Azure SQL 托管实例

语法

-- Syntax for Azure SQL Managed Instance
CREATE LOGIN login_name [FROM EXTERNAL PROVIDER [WITH OBJECT_ID = 'objectid'] ] { WITH <option_list> [,..]}

<option_list> ::=
    PASSWORD = {'password'}
    | SID = sid
    | DEFAULT_DATABASE = database
    | DEFAULT_LANGUAGE = language

参数

login_name

FROM EXTERNAL PROVIDER 子句一起使用时,登录名指定 Microsoft Entra 主体,它可以是 Microsoft Entra 用户、组或应用程序。 否则,登录名表示所创建 SQL 登录名的名称。

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

FROM EXTERNAL PROVIDER

指定登录名用于 Microsoft Entra 身份验证。

WITH OBJECT_ID = 'objectid'

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

注意

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

PASSWORD = 'password'

指定正在创建的 SQL 登录的密码。 请使用强密码。 有关详细信息,请参阅强密码密码策略。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

密码是区分大小写的。 密码长度应始终至少为 10 个字符,不能超过 128 个字符。 密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。 密码不能包含单引号或 login_name

SID =sid

用于重新创建登录名。 仅适用于 SQL Server 身份验证登录名。 指定新 SQL Server 身份验证登录的 SID。 如果未使用此选项,SQL Server 会自动分配 SID。 SID 结构取决于 SQL Server 版本。 对于 SQL 数据库,这是包含 0x01060000000000640000000000000000 的 32 字节 (binary(32)) 文本以及表示 GUID 的 16 个字节。 例如,SID = 0x0106000000000064000000000000000014585E90117152449347750164BA00A7

注解

  • FROM EXTERNAL PROVIDER 语法创建映射到 Microsoft Entra 帐户的服务器级主体

  • 指定时间 FROM EXTERNAL PROVIDER

    • login_name必须表示当前Azure SQL 托管实例在 Microsoft Entra ID 中可访问的现有 Microsoft Entra 帐户(用户、组或应用程序)。 对于 Microsoft Entra 主体,CREATE LOGIN 语法需要:

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

      • Microsoft Entra 组和应用程序的 Microsoft Entra 对象的 DisplayName。

    • 无法使用 PASSWORD 选项。

  • 默认情况下,在省略子句时 FROM EXTERNAL PROVIDER ,会创建常规 SQL 登录名。

  • Microsoft Entra 登录名在sys.server_principals中可见,类型列值设置为 E,type_desc设置为映射到 Microsoft Entra 用户的登录名EXTERNAL_LOGIN,或者将列值设置为 X,type_desc值设置为映射到 Microsoft Entra 组的登录名EXTERNAL_GROUP

  • 有关用于传输登录名的脚本,请参阅如何在 SQL Server 2005 和 SQL Server 2008 的实例之间传输登录名和密码

  • 自动创建登录名将启用新的登录名,并授予它服务器级 CONNECT SQL 权限。

重要

有关在 Azure SQL 数据库中使用登录名和用户的信息,请参阅在 Azure SQL 数据库中管理登录名

登录名和权限

只有服务器级别主体登录(由预配过程创建)或 master 数据库中的 securityadminsysadmin 数据库角色成员可以创建新的登录名。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE

默认情况下,在 master 中授予新创建的 Microsoft Entra 登录的标准权限为:CONNECT SQLVIEW ANY DATABA标准版

SQL 托管实例登录名

  • 必须具有对服务器的 ALTER ANY LOGIN 权限或固定服务器角色(securityadminsysadmin 中的一个)的成员身份。 只有对服务器具有 ALTER ANY LOGIN 权限的 Microsoft Entra 帐户或其中一个角色的成员身份才能执行 create 命令。

  • 如果登录名是 SQL 主体,则只有属于角色的 sysadmin 登录名才能使用 create 命令为 Microsoft Entra 帐户创建登录名。

  • 必须是与Azure SQL 托管实例相同的 Microsoft Entra 租户的成员。

创建登录后

创建登录名后,该登录名可以连接到托管实例,但只具有授予 public 角色的权限。 考虑执行以下部分活动。

  • 若要从 Microsoft Entra 登录名创建用户,请参阅 CREATE U标准版R

  • 若要向数据库中的用户授予权限,请使用 ALTER SERVER ROLE ...ADD MEMBER 语句将用户添加到其中一个内置数据库角色或自定义角色中,或者使用 GRANT 语句直接向用户授予权限。 有关详细信息,请参阅非管理员角色其他服务器级管理角色ALTER SERVER ROLEGRANT 语句。

  • 若要授予服务器范围内的权限,请在 master 数据库中创建数据库用户,并使用 ALTER SERVER ROLE ...ADD MEMBER 语句将用户添加到其中一个管理服务器角色。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE服务器角色

    • 使用以下命令将 sysadmin 角色添加到 Microsoft Entra 登录名: ALTER SERVER ROLE sysadmin ADD MEMBER [MS_Entra_login]
  • 使用 GRANT 语句将服务器级别权限授予新的登录名或包含该登录名的角色。 有关详细信息,请参阅 GRANT

限制

  • 不支持将映射到 Microsoft Entra 组的 Microsoft Entra 登录名设置为数据库所有者。

  • 支持使用其他 Microsoft Entra 主体模拟 Microsoft Entra 登录名,例如 EXECUTE AS 子句。

  • 只有属于 sysadmin 角色的服务器主体(登录名)才能执行针对 Microsoft Entra 主体的以下操作:

    • EXECUTE AS USER
    • EXECUTE AS LOGIN
  • 从另一个 Microsoft Entra 目录导入的外部(来宾)用户不能直接配置为使用Azure 门户SQL 托管实例的 Microsoft Entra 管理员。 而是将外部用户加入 可分配角色的组 ,并将该组配置为实例管理员。 可使用 PowerShell 或 Azure CLI 将各来宾用户设置为实例管理员。

  • 登录名不会副本 (replica)故障转移组中的辅助实例。 登录名保存在 master 数据库中,这是系统数据库,因此不会进行异地副本 (replica)。 若要解决此问题,必须在辅助实例上使用相同的 SID 创建登录名。

-- Code to create login on the secondary instance
CREATE LOGIN foo WITH PASSWORD = '<enterStrongPasswordHere>', SID = <login_sid>;

示例

A. 创建带密码的登录名

以下示例为特定用户创建登录名并分配密码。

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';
GO

B. 从 SID 创建登录名

以下示例首先创建 SQL Server 身份验证登录,并确定该登录的 SID。

CREATE LOGIN TestLogin WITH PASSWORD = 'SuperSecret52&&';

SELECT name, sid FROM sys.sql_logins WHERE name = 'TestLogin';
GO

我的查询返回 0x241C11948AEEB749B0D22646DB1A19F2 作为 SID。 你的查询将返回不同的值。 以下语句将删除登录名,然后重新创建登录名。 使用前面的查询中的 SID。

DROP LOGIN TestLogin;
GO

CREATE LOGIN TestLogin
WITH PASSWORD = 'SuperSecret52&&', SID = 0x241C11948AEEB749B0D22646DB1A19F2;

SELECT * FROM sys.sql_logins WHERE name = 'TestLogin';
GO

°C 为 Microsoft Entra 用户创建登录名

以下示例为名为 contoso 的租户中的 Microsoft Entra 帐户joe@contoso.onmicrosoft.com创建登录名。

CREATE LOGIN [joe@contoso.onmicrosoft.com] FROM EXTERNAL PROVIDER

GO

D. 为联合 Microsoft Entra 帐户创建登录名

以下示例为名为 contoso 的租户中的联合 Microsoft Entra 帐户bob@contoso.com创建登录名。 用户 bob 也可以是来宾用户。

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

E. 为 Microsoft Entra 组创建登录名

以下示例为租户 contoso 中存在的 Microsoft Entra 组 mygroup 创建登录名。

CREATE LOGIN [mygroup] FROM EXTERNAL PROVIDER
GO

F. 为 Microsoft Entra 应用程序创建登录名

以下示例为租户 contoso 中存在的 Microsoft Entra 应用程序 myapp 创建登录名。

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER

G. 检查新添加的登录名

要检查新添加的登录名,请执行以下 T-SQL 命令:

SELECT *
FROM sys.server_principals;
GO

* Azure Synapse
Analytics *

 

Azure Synapse Analytics

语法

-- Syntax for Azure Synapse Analytics
CREATE LOGIN login_name
  { 
    FROM EXTERNAL PROVIDER
    | WITH <option_list> [,..] 
  }

<option_list> ::=
    PASSWORD = { 'password' }
    [ , SID = sid ]

参数

注意

Microsoft Entra 服务器主体(登录名)当前为公共预览版。 与 FROM EXTERNAL PROVIDER 子句一起使用时,登录名指定 Microsoft Entra 主体,它可以是 Microsoft Entra 用户、组或应用程序。 否则,登录名表示所创建 SQL 登录名的名称。

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

FROM EXTERNAL PROVIDER

指定登录名用于 Microsoft Entra 身份验证。

login_name

指定创建的登录名。 Azure Synapse 中的 SQL Analytics 仅支持 SQL 登录名。 若要为 Microsoft Entra 用户创建帐户,请使用 CREATE U标准版R 语句。

PASSWORD *='password'

指定正在创建的 SQL 登录的密码。 请使用强密码。 有关详细信息,请参阅强密码密码策略。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

密码是区分大小写的。 密码应始终长度至少为 8 个字符,不能超过 128 个字符。 密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。 密码不能包含单引号或 login_name

SID = sid

用于重新创建登录名。 仅适用于 SQL Server 身份验证登录,不适用于 Windows 身份验证登录。 指定新 SQL Server 身份验证登录的 SID。 如果未使用此选项,SQL Server 会自动分配 SID。 SID 结构取决于 SQL Server 版本。 对于 SQL Analytics,这是包含 0x01060000000000640000000000000000 的 32 字节 (binary(32)) 文本以及表示 GUID 的 16 个字节。 例如,SID = 0x0106000000000064000000000000000014585E90117152449347750164BA00A7

备注

登录名

CREATE LOGIN 语句必须是批中的唯一语句。

在使用工具(如 sqlcmd)连接到 Azure Synapse 中时,必须使用 <login>@<server> 表示法将 SQL Analytics 服务器名称追加到连接字符串中的登录名之后。 例如,如果登录为 login1,SQL Analytics 服务器的完全限定名称是 servername.database.windows.net,则连接字符串的 username 参数应是 login1@servername。 由于 username 参数的总长度为 128 个字符,因此,login_name 被限定为 127 个字符减去服务器名称的长度 。 在示例中,login_name 只能包含 117 个字符,因为 servername 包含 10 个字符。

若要创建登录名,必须连接到 master 数据库。

SQL Server 规则允许你创建 <loginname>@<servername> 格式的 SQL Server 身份验证登录。 如果你的 SQL 数据库服务器是 myazureserver 并且登录名是 myemail@live.com,则必须提供 myemail@live.com@myazureserver 格式的登录名。

对连接和服务器级别的防火墙规则进行身份验证时所需的登录数据会暂时缓存在每个数据库中。 此缓存定期刷新。 若要强制刷新身份验证缓存并确保数据库具有最新版本的登录表,请执行 DBCC FLUSHAUTHCACHE

有关登录名的详细信息,请参阅管理数据库和登录名

权限

只有服务器级别主体登录(由预配过程创建)或 master 数据库中的 loginmanager 数据库角色成员可以创建新的登录。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE

创建登录后

创建登录后,该登录可以连接到 Azure Synapse,但是只具有授予 public 角色的权限。 考虑执行以下部分活动。

  • 要连接到数据库,请创建登录名对应的数据库用户。 有关详细信息,请参阅 CREATE USER

  • 若要向数据库中的用户授予权限,请使用 ALTER SERVER ROLE ...ADD MEMBER 语句将用户添加到其中一个内置数据库角色或自定义角色中,或者使用 GRANT 语句直接向用户授予权限。 有关详细信息,请参阅非管理员角色其他服务器级管理角色ALTER SERVER ROLEGRANT 语句。

  • 若要授予服务器范围内的权限,请在 master 数据库中创建数据库用户,并使用 ALTER SERVER ROLE ...ADD MEMBER 语句将用户添加到其中一个管理服务器角色。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE服务器角色

  • 使用 GRANT 语句将服务器级别权限授予新的登录名或包含该登录名的角色。 有关详细信息,请参阅 GRANT

示例

A. 创建带密码的登录名

以下示例为特定用户创建登录名并分配密码。

CREATE LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';
GO

B. 从 SID 创建登录名

以下示例首先创建 SQL Server 身份验证登录,并确定该登录的 SID。

CREATE LOGIN TestLogin WITH PASSWORD = 'SuperSecret52&&';

SELECT name, sid FROM sys.sql_logins WHERE name = 'TestLogin';
GO

我的查询返回 0x241C11948AEEB749B0D22646DB1A19F2 作为 SID。 你的查询将返回不同的值。 以下语句将删除登录名,然后重新创建登录名。 使用前面的查询中的 SID。

DROP LOGIN TestLogin;
GO

CREATE LOGIN TestLogin
WITH PASSWORD = 'SuperSecret52&&', SID = 0x241C11948AEEB749B0D22646DB1A19F2;

SELECT * FROM sys.sql_logins WHERE name = 'TestLogin';
GO

* Analytics
Platform System (PDW) *

 

分析平台系统

语法

-- Syntax for Analytics Platform System
CREATE LOGIN loginName { WITH <option_list1> | FROM WINDOWS }

<option_list1> ::=
    PASSWORD = { 'password' } [ MUST_CHANGE ]
    [ , <option_list> [ ,... ] ]

<option_list> ::=
      CHECK_EXPIRATION = { ON | OFF}
    | CHECK_POLICY = { ON | OFF}

参数

login_name

指定创建的登录名。 有四种类型的登录名:SQL Server 登录名、Windows 登录名、证书映射登录名以及非对称密钥映射登录名。 创建从 Windows 域帐户映射的登录名时,必须使用采用 [<domainName>\<login_name>] 格式的 Windows 2000 用户登录名。 不能login_name@DomainName格式使用 UPN。 有关示例,请参阅本文后面的示例 D。 身份验证登录名是类型 sysname,必须符合标识符的规则,并且不能包含“\”。 Windows 登录名可以包含“\”。 基于 Active Directory 用户的登录名的名称限制为少于 21 个字符。

PASSWORD ='password'

仅适用于 SQL Server 登录。 指定正在创建的登录名的密码。 请使用强密码。 有关详细信息,请参阅强密码密码策略。 从 SQL Server 2012 (11.x) 开始,存储的密码信息使用 SHA-512 加盐密码进行计算。

密码是区分大小写的。 密码应始终长度至少为 8 个字符,不能超过 128 个字符。 密码可以包含 a-z、A-Z、0-9 和大多数非字母数字字符。 密码不能包含单引号或 login_name

MUST_CHANGE

仅适用于 SQL Server 登录。 如果包括此选项,则 SQL Server 将在首次使用新登录时提示用户输入新密码。

CHECK_EXPIRATION = { ON | OFF }

仅适用于 SQL Server 登录。 指定是否应对此登录帐户强制实施密码过期策略。 默认值为 OFF。

CHECK_POLICY = { ON | OFF }

仅适用于 SQL Server 登录。 指定应对此登录强制实施运行 SQL Server 的计算机的 Windows 密码策略。 默认值为 ON。

如果 Windows 策略要求强密码,密码必须至少包含以下四个特点中的三个:

  • 大写字符 (A-Z)。
  • 小写字符 (a-z)。
  • 数字 (0-9)。
  • 非字母数字字符之一,例如空格、_、@、*、^、%、!、$、#或 &。

WINDOWS

指定将登录名映射到 Windows 登录名。

备注

  • 密码是区分大小写的。
  • 如果指定 MUST_CHANGE,则 CHECK_EXPIRATION 和 CHECK_POLICY 必须设置为 ON。 否则,该语句将失败。
  • 不支持CHECK_POLICY = OFF 和 CHECK_EXPIRATION = ON 的组合。
  • 如果 CHECK_POLICY 设置为 OFF,将对 lockout_time 进行重置,并将 CHECK_EXPIRATION 设置为 OFF。

重要

只有在 Windows Server 2003 及更高版本上才会强制执行 CHECK_EXPIRATION 和 CHECK_POLICY。 有关详细信息,请参阅 Password Policy

权限

只有具有针对服务器的 ALTER ANY LOGIN 权限或 securityadmin 固定服务器角色的成员身份的用户才可创建登录 。 有关详细信息,请参阅服务器级别角色ALTER SERVER ROLE

创建登录后

创建登录后,该登录可以连接到 Azure Synapse Analytics,但是只具有授予 public 角色的权限。 考虑执行以下部分活动。

  • 要连接到数据库,请创建登录名对应的数据库用户。 有关详细信息,请参阅 CREATE USER
  • 使用 CREATE SERVER ROLE 创建用户定义的服务器角色。 使用 ALTER SERVER ROLE ...ADD MEMBER 将新登录名添加到用户定义的服务器角色。 有关详细信息,请参阅 CREATE SERVER ROLEALTER SERVER ROLE
  • 使用 sp_addsrvrolemember 将登录名添加到固定服务器角色。 有关详细信息,请参阅服务器级别角色sp_addsrvrolemember
  • 使用 GRANT 语句将服务器级别权限授予新的登录名或包含该登录名的角色。 有关详细信息,请参阅 GRANT

示例

G. 创建具有密码的 SQL Server 身份验证登录名

下面的示例创建密码为 A2c3456 的登录名 Mary7

CREATE LOGIN Mary7 WITH PASSWORD = 'A2c3456$#' ;

H. 使用选项

下面的示例创建具有密码和一些可选参数的登录名 Mary8

CREATE LOGIN Mary8 WITH PASSWORD = 'A2c3456$#' MUST_CHANGE,
CHECK_EXPIRATION = ON,
CHECK_POLICY = ON;

I. 从 Windows 域帐户创建登录名

下面的示例在 Contoso 域中使用 Windows 域帐户创建名为 Mary 的登录名。

CREATE LOGIN [Contoso\Mary] FROM WINDOWS;
GO