为啥我使用 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 MSSQLDataSource
。 MSSQLDataSource
实例有一个属性 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 身份验证?
为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?
为啥我的SQL 2005用Windows身份验证登陆的时候出现18456错误