无法在 SQL 2019 Linux 上使用 PolyBase 通过 ODBC 查询 AS400

Posted

技术标签:

【中文标题】无法在 SQL 2019 Linux 上使用 PolyBase 通过 ODBC 查询 AS400【英文标题】:Unable to query AS400 over ODBC with PolyBase on SQL 2019 Linux 【发布时间】:2021-11-14 06:29:09 【问题描述】:

我想在运行在 Ubuntu 容器中的 SQL Server 2019 实例上创建外部表,以查询 AS400 上的 DB2 数据库。我正在使用 ibm iaccess 1.1.0.15 amd64 ODBC 驱动程序。当我尝试创建外部表时,我得到以下错误:

消息 105082,第 16 级,状态 1,第 15 行 105082;通用 ODBC 错误:NativeOdbcConnection.Open,OdbcConnectionCreate 中的错误:SqlState:,NativeError:111234,'错误调用:SQLDriverConnect(this->_hdbc, NULL, (SQLWCHAR*)connectionString, SQL_NTS, NULL, 0, &cbConnStrOut, SQL_DRIVER_NOPROMPT) , SQL 返回码:-1 | SQL 错误信息:**内部 DmsNative 错误:返回的 SQLGetDiagRec:-1 |连接池:1 |调用错误:pConn->Create(connectionString, databaseName, useConnectionPooling, packetSize, connectionLoginTimeout, environmentSettings, transactionToken, transactionTokenSize, resourceGroupName, driverCapabilities, spid) |状态:FFFF,数量:1,活动连接:1',连接字符串:Driver=IBM i Access ODBC Driver;system=MYAS400SYSTEM;uid=MYAS400UID;server=MYAS400.MYDOMAIN.com。

这是我正在使用的 Dockerfile

# SQL Server Command Line Tools - custom image
# From Ubuntu 20.04 as base image
FROM ubuntu:20.04 as base

# Installing system utilities
RUN apt-get update && \
    apt-get install -y apt-transport-https curl gnupg && \
    # Adding custom MS repository
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
    curl https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list > /etc/apt/sources.list.d/mssql-server-2019.list && \
    curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | tee /etc/apt/sources.list.d/msprod.list
# From base image
FROM base as release

# Add the SQL startup scripts
COPY . /usr/src/app

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

# Grant permissions for the setupsql script to be executable
RUN chmod +x /usr/src/app/setupsql.sh

# Installing SQL Server drivers and tools
RUN apt-get update 
RUN apt-get install -y mssql-server-polybase
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17
RUN ACCEPT_EULA=Y apt-get install -y mssql-tools 
# Install the IBM iAccess ODBC Driver
RUN dpkg -i /usr/src/app/ibm-iaccess-1.1.0.15-1.0.amd64.deb
RUN apt-get install -f
# Cleanup the Dockerfile
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists

CMD exec /bin/bash entrypoint.sh

我可以使用 SSMS 通过本地主机连接到容器中的 SQL 服务器实例。创建凭证和数据源均成功。创建外部表是我得到错误的地方。

这里是创建外部数据源和外部表的 SQL 脚本:

CREATE DATABASE SCOPED CREDENTIAL AS400Credential
WITH IDENTITY = 'AS400UID',
SECRET = 'AS400PWD';  
GO

CREATE EXTERNAL DATA SOURCE MYAS400 WITH (LOCATION = 'odbc://MYAS400.MYDOMAIN.com', 
   CONNECTION_OPTIONS = 'DRIVER=IBM i Access ODBC Driver;SYSTEM=MYAS400;', 
   PUSHDOWN = OFF,
   CREDENTIAL = AS400CREDENTIAL);
GO

CREATE EXTERNAL TABLE EXT.Test 
(
    hstr NCHAR(50) NOT NULL,
    hreg NCHAR(50) NOT NULL,
    htr# NCHAR(50) NOT NULL,
    httm NCHAR(50) NOT NULL
)
WITH ( LOCATION='MYAS400DATABASE.SCHEMA.TABLE', DATA_SOURCE= MYAS400)

关于如何使用 PolyBase 成功连接到 AS400 有什么想法吗?

【问题讨论】:

此 ODBC 连接是否在 Polybase 外部工作? 是的,我可以在容器内部的命令行中使用 IBM i Access ODBC 驱动程序和 isql 连接到 AS400。此命令连接没有问题:``` isql -v -k "DRIVER=IBM i Access ODBC Driver;System=MYAS400;UID=MYUID;PWD=MIPWD;" ``` 【参考方案1】:

PolyBase Generic ODBC 连接目前仅在 Windows 上可用。

此功能需要 Windows 上的 SQL Server。

Configure PolyBase to access external data with ODBC generic types

目前Linked Server to non-SQL Server targets, and External Access and Unsafe CLR 也仅适用于 Windows。

您可以使用Python extensibility 和pyodbc 来查询您的iSeries。

【讨论】:

我的最终目标是将其作为 Azure 容器实例运行。但是,Windows 容器不能从 Azure 容器实例加入虚拟网络,只能加入基于 linux 的容器。 Windows 容器上的 SQL Server 在任何情况下都不受官方支持。

以上是关于无法在 SQL 2019 Linux 上使用 PolyBase 通过 ODBC 查询 AS400的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL

通过 SQL 查询更新 PO 状态

Pymssql 无法连接到 Amazon Linux 2 上的 Azure SQL Server

无法从在 Docker (Linux) 中运行的 ASP.NET Core 连接到 SQL Server 命名实例

无法让 SQL Server 子查询选择所需的结果

ORACLE: Analyze Table 失敗