无法使用本地 127.0.0.1 地址连接到 SQL Server,除非登录用户具有 sysadmin 角色

mic*_*amp 3 sql-server permissions connectivity connection-string

问题

Microsoft ODBC Driver 17 for SQL Server我正在尝试通过sqlcmd设置-S指向 的(服务器)选项来连接到服务器127.0.0.1,1434。我已确认这是正确的端口。

我无法使用传统的., (local),localhost选项。它必须通过其环回接口 IP 来寻址服务器127.0.0.1(有关原因的其他上下文,请参阅帖子末尾)。

127.0.0.1TLDR:为什么当登录名具有角色时我只能通过本地 IP 进行连接sysadmin

我尝试过什么

当我使用具有以下角色的登录名 ( local)进行连接时sysadmin

sqlcmd -S 127.0.0.1,1434 -U local -P **** -d ****
1>
Run Code Online (Sandbox Code Playgroud)

不过,我正在尝试通过我创建的新登录进行连接,该登录具有更严格的访问权限。因此我不想给这个新登录角色赋予角色sysadmin,而是使用默认public角色。

当我尝试使用此登录以相同的方式连接时,我得到Login failed for user 'TestLogin'

sqlcmd -S 127.0.0.1,1434 -U TestLogin -P **** -d ****;
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed for user 'TestLogin '..
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么sysadmin角色以某种方式允许“远程”(主机上的所有本地)访问,但如果没有这个角色,它就会失败。

根本原因

根本原因是sysadmin需要角色才能通过 进行连接127.0.0.1。我找不到任何信息为什么会出现这种情况。

完整的上下文

我的最终目标是能够使用 SQLALchemy/PyODBC 从容器化进程连接到服务器。在此配置中,我用于host.docker.internal访问主机localhost( 127.0.0.1)。

我能够使用local(带sysadmin角色)登录从容器内部建立连接,没有问题。但是,当使用更受限制的登录时,它会失败。

所以我尝试通过从容器外部尝试并直接从主机上的 powershell 调用 sqlcmd 来隔离问题。正如您从最初的问题中看到的那样,我遇到了同样的问题,因此它与容器中的情况无关。

我提供了这个额外的上下文,因为在容器中我无法使用传统的., (local),localhost选项。它必须通过其环回接口 IP 来寻址服务器,127.0.0.1因为这是通过以下方式代理到容器的:host.docker.internal

Dan*_*man 5

TCP 1434 通常是专用管理连接的默认端口,需要 sysadmin。这就解释了为什么使用 sysadmin 角色成员时连接成功,但使用最低权限登录时连接失败。

如果您尚未执行此操作,请使用SQL Server 配置管理器启用 127.0.0.1 环回 IP 上的端口 1433 。然后,您应该能够在没有系统管理员角色成员身份的情况下进行连接。此外,由于 1433 是 SQL Server 默认端口,因此不需要显式端口规范。