登录SQL Server数据库时报错:
TITLE: Connect to Server
------------------------------
Cannot connect to <Server address>.
------------------------------
ADDITIONAL INFORMATION:
Login failed for user '<token-identified principal>'. (Microsoft SQL Server, Error: 18456)
For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-18456-database-engine-error
------------------------------
BUTTONS: OK
------------------------------
通常是由于使用 Azure Active Directory (AAD) 身份验证时,登录用户未在目标数据库中正确配置所导致的。
错误原因分析
此错误通常与以下因素有关:
AAD 用户未在数据库中创建:即使您是 Azure SQL Server 的 AAD 管理员,如果未在特定数据库中创建对应的用户,仍会导致登录失败。 默认连接到 master 数据库:使用 SSMS 连接时,默认连接的是 master 数据库。如果您的 AAD 用户未在 master 数据库中存在,也会出现此错误。 AAD 组成员未正确映射:如果您是通过 AAD 组授予访问权限,确保该组已在数据库中正确创建,并分配了相应的角色。 令牌过期或无效:使用 AAD 身份验证时,令牌的有效性也可能导致此错误。解决步骤
1. 在数据库中创建 AAD 用户
使用具有足够权限的账户连接到目标数据库,执行以下 T-SQL 命令:
CREATE USER [your_user@domain.com] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [your_user@domain.com];
ALTER ROLE db_datawriter ADD MEMBER [your_user@domain.com];
这将为 AAD 用户创建数据库用户,并授予读取和写入权限。
2. 指定连接的默认数据库
在 SSMS 的“连接到服务器”对话框中,点击“选项”,在“连接属性”选项卡中,将“连接到数据库”设置为目标数据库的名称,而非默认的 master 数据库。
3. 确保 AAD 组已正确配置
如果你是通过 AAD 组授予访问权限,确保该组已在数据库中创建,并分配了相应的角色。例如:
CREATE USER [AAD_Group_Name] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [AAD_Group_Name];
请注意,某些情况下,单独为组成员创建用户可能更为可靠。
4. 检查令牌有效性
确保使用的 AAD 令牌未过期,并且在连接时使用了正确的身份验证方法。