SqlServer创建数据库账号,连接报“无法打开登录所请求的数据库 xxx。登录失败。ClientConnectionId:xxxx“

问题描述

近期有个源库切换了地址,数据平台准备迁移的时候DBA哥们又休假了,运维人又不熟,百度了新增账号给新了增SQL Server数据库账号,尝试连接时,出现错误提示,但死活联不通,报错如下:

"无法打开登录所请求的数据库 xxx。登录失败。ClientConnectionId:xxxx"。

使用他们的管理员用户又可以,所以纳闷这玩意咋发生的。搜了一下原因,说是该问题通常与权限配置或数据库状态相关。

解决思路

我就不跟大家过网上的答案了,直接给大家最直白最准确最值得信赖的回答(手动滑稽)。

前提是有账户可以登录,如果数据库本身还有问题,请检查数据库状态。

1、登录可以登录管理员用户,查登录日志。

sql 复制代码
EXEC sp_readerrorlog 0, 1, 'Login failed';

基本上所有的登录日志都可以查到,我这里先发现登录密码多了一个感叹号,这个调整就不细说了,发现的第二个问题也是主要问题是:"无法打开明确指定的数据库"

2、检查SQL Login 的 CREATE USER(数据库级映射)

sql 复制代码
SELECT sp.name
FROM sys.server_principals sp
LEFT JOIN sys.database_principals dp ON sp.sid = dp.sid
WHERE dp.name IS NULL
AND sp.type = 'S';

如果这个查询能够查询出你的账户,很好,你已经基本接触到真相了。我也是在这里发现映射存在问题。

3、重建账户。

原创建和授权语句如下:

sql 复制代码
CREATE LOGIN ODS_SELECT
WITH PASSWORD ='xxxxxx'

USE schema_test;
CREATE USER ODS_SELECT FOR LOGIN ODS_SELECT;

ALTER ROLE db_datareader ADD MEMBER ODS_SELECT;

看着这里我就在猜测,是不是SqlServer对大小写敏感,因为SELECT * FROM sys.server_principals WHERE name = 'ods_select',这里面得name是小写。尝试着进行重新开户。

调整后的创建和授权语句如下(这里需要删除旧的账户):

sql 复制代码
DROP USER IF EXISTS ods_select;

IF EXISTS (SELECT * FROM sys.server_principals WHERE name = 'ods_select')
    DROP LOGIN ods_select;

CREATE LOGIN ods_select
WITH PASSWORD = 'xxxxxx';


USE schema_test;
GO
CREATE USER ods_select FOR LOGIN ods_select;

ALTER ROLE db_datareader ADD MEMBER ods_select;
GO

这时候是可以正常访问了,但在SqlServer官方文档中说明其对大小写不敏感,可能只是重建账户恰好绑定了SID,所以有问题就根据上面的一二三步逐级推进即可

扩展阅读