为啥我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?

Posted

技术标签:

【中文标题】为啥我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?【英文标题】:Why does my login to MS SQL with AzureML dataprep using Windows authentication fail?为什么我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败? 【发布时间】:2019-07-03 06:15:42 【问题描述】:

我尝试在 Azure Notebook 中使用azureml.dataprep 连接到 MS SQL 数据库,如https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-load-data#load-sql-data 中所述,使用MSSqlDataSource,使用表单代码

import azureml.dataprep as dprep

secret = dprep.register_secret(value="[SECRET-PASSWORD]", id="[SECRET-ID]")

ds = dprep.MSSQLDataSource(server_name="[SERVER-NAME]",
                       database_name="[DATABASE-NAME], [PORT]",
                       user_name="[DATABASE-USERNAME]",
                       password=secret)

设置[DATABASE-USERNAME] 等于MYWINDOWSDOMAIN\\MYWINDOWSUSERNAME 并且密码[SECRET-PASSWORD] 与我的Windows 密码一致(即尝试使用Windows 身份验证)。

使用

触发查询后
dataflow = dprep.read_sql(ds, "SELECT top 100 * FROM [dbo].[MYTABLE]")
dataflow.head(5)

我明白了

ExecutionError: 登录失败。

我可以在没有 Windows 身份验证的情况下连接到其他数据库。我做错了什么?

【问题讨论】:

您是否尝试过使用其他数据库工具访问数据库?喜欢datagrip 嗨!想坚持dataprep(我可以使用 ODBC 驱动程序访问数据库)但想在这里使用 AzureML 工具。 您是否检查了 Azure 中 SQL 数据库的防火墙设置? 应该没问题 (?) [SERVER-NAME]。 【参考方案1】:

考虑使用SQL server authentication 作为连接到该数据库的解决方法/替代解决方案(同样的dataflow 语法将起作用):

import azureml.dataprep as dprep
secret = dprep.register_secret(value="[SECRET-PASSWORD]", id="[SECRET-ID]")

ds = dprep.MSSQLDataSource(server_name="[SERVER-NAME],[PORT]",
               database_name="[DATABASE-NAME]",
               user_name="[DATABASE-USERNAME]",
               password=secret)

注意dataprep 的用法已被弃用,sqlalchemy 可以替代使用

import pandas as pd
from sqlalchemy import create_engine

def mssql_engine(user = "[DATABASE-USERNAME]", 
                 password = "[SECRET-PASSWORD]", 
                 host = "[SERVER-NAME],[PORT]",
                 db = "[DATABASE-NAME]"):
    engine = create_engine(f'mssql+pyodbc://user:password@host/db?driver=SQL+Server')
    return engine

query = "SELECT ..."

df = pd.read_sql(query, mssql_engine())

【讨论】:

【参考方案2】:

Here is the MS Doc on MSSQLDataSourceMSSQLDataSource 实例有一个属性 credentials_type,默认为 SERVER。在进行查询之前,请尝试将其显式设置为 WINDOWS。此外,端口应与服务器名称一起指定。

import azureml.dataprep as dprep

windows_domain = 'localhost'
windows_user = 'my_user'
windows_password = 'my_password'

secret = dprep.register_secret(value=windows_password, id="password")

ds = dprep.MSSQLDataSource(server_name="localhost",
                   database_name="myDb",
                   user_name=f'windows_domain\windows_user',
                   password=secret)

ds.credentials_type = dprep.DatabaseAuthType.WINDOWS

dataflow = dprep.read_sql(ds, "SELECT top 100 * FROM [dbo].[MYTABLE]")
dataflow.head(5)

【讨论】:

哦,谢谢,但是ExecutionError: Could not connect to specified database. 仍然失败了最后我放弃了(请参阅我自己的回答,了解我是如何“解决”这个问题的) @DavideFiocco 我稍微修改了上面的答案。我可以成功地使用它在我的本地 PC 上进行 Windows 身份验证/查询 sql express 数据库。我没有要处理的完整域,但本地 Windows 身份验证按预期工作。 实际上经过进一步测试,似乎指定的Windows凭据与服务器身份验证无关。如果没有提供 Windows 凭据,则查询失败,但提供无效凭据没有任何区别 - 身份验证使用运行 python 进程的 Windows 用户。我不确定这在 linux 上是如何工作的 - 似乎对 Windows 身份验证的支持非常有限。

以上是关于为啥我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cURL 不适用于 IIS7 上的 Windows 身份验证?

为啥我无法通过 Firebase 的身份验证?

为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?

为啥我的SQL 2005用Windows身份验证登陆的时候出现18456错误

为啥客户端在 IE 中访问网络时集成 Windows 身份验证失败?

为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?