为啥我使用 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 失败?的主要内容,如果未能解决你的问题,请参考以下文章