You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure SQL Server只读用户登录失败(错误18456)如何排查修复?

排查Azure SQL只读登录失败(Error 18456)的问题

看起来你遇到的是典型的登录名与数据库用户混淆导致的登录失败,结合你的操作步骤,我帮你梳理下排查和修复的方法:

核心问题:登录时用错了身份标识

你创建的readonlylogin服务器级的登录名(LOGIN),而readonlyuser数据库级的用户(USER)——Azure SQL登录时必须使用登录名,而不是数据库用户名。你现在用readonlyuser作为登录账号,自然会提示登录失败。

修复步骤1:使用正确的登录名尝试登录

直接用readonlylogin作为用户名,密码保持1231!#ASDF!a重新尝试登录,这应该能解决最基础的登录问题。

额外排查点(如果登录还是失败)

如果用readonlylogin还是登不上,检查以下几个配置:

  • 确认Azure SQL服务器开启了SQL身份验证
    在Azure门户的SQL服务器页面,进入「设置 > 服务器管理员」,确认是否勾选了「SQL身份验证」。如果只开启了Azure AD身份验证,SQL登录名是无法使用的。

  • 确认登录名拥有CONNECT SQL权限
    默认创建LOGIN时会自动赋予CONNECT SQL权限,但如果之前有修改过服务器角色,可能会丢失这个权限。可以用pt_admin登录master数据库,执行以下命令检查并修复:

    -- 检查权限
    SELECT name, permission_name 
    FROM sys.server_permissions sp
    JOIN sys.server_principals spri ON sp.grantee_principal_id = spri.principal_id
    WHERE spri.name = 'readonlylogin';
    
    -- 如果没有CONNECT SQL,手动添加
    GRANT CONNECT SQL TO readonlylogin;
    
  • 确认数据库用户与登录名的映射正确
    虽然你已经执行了创建用户的命令,但可以在DB1和DB2中执行以下命令验证映射关系:

    SELECT name, login_name 
    FROM sys.database_principals 
    WHERE name = 'readonlyuser';
    

    确保login_name显示为readonlylogin,如果不是,重新执行创建用户的命令:

    DROP USER IF EXISTS readonlyuser;
    CREATE USER readonlyuser FROM LOGIN readonlylogin;
    EXEC sp_addrolemember 'db_datareader', 'readonlyuser';
    

验证只读权限

登录成功后,你可以在DB1/DB2中执行以下命令验证权限:

-- 尝试读取数据(应该成功)
SELECT * FROM [你的表名];

-- 尝试修改数据(应该失败,提示权限不足)
UPDATE [你的表名] SET [列名] = 'test' WHERE 1=1;

内容的提问来源于stack exchange,提问作者Ray

火山引擎 最新活动