先日、SQL Server 2019 CU2 がリリースされました。
今回の CU では SQL Server 2019 でログ配布を設定した場合に、ログ配布の履歴用のジョブでエラーが発生した問題の解消 などが行われているのですが、それ以外にも PolyBase の外部テーブルの接続性に影響を与える改善が行われています。
- FIX: Creating an external table against an Oracle database in SQL Server 2019 may fail if using Oracle database 12.2 or later versions
- FIX: Include support for Excel ODBC driver and Text ODBC driver from Microsoft Access Database Engine Redistributable package in PolyBase for SQL Server 2019
一つ目は Oracle の外部テーブルを作成する場合の改善です。
RTM 時点の PolyBase では、Oracle 12.2 以降に接続を使用とした場合、次のようなエラーが発生することがありました。
Msg 105082, Level 16, State 1, Line LineNumber
105082;Generic ODBC error: [Microsoft][ODBC Oracle Wire Protocol driver][Oracle]ORA-28040: No matching authentication protocol Additional error <2>: ErrorMsg: [Microsoft][ODBC Oracle Wire Protocol driver][Oracle]ORA-28040: No matching authentication protocol, SqlState: HY000, NativeError: 28040 .
PolyBase で標準に含まれている ODBC ドライバーは、Oracle 12.2 以降で接続をしようとした場合は、Oracle 側の sqlnet.ora に次の設定がされていないと接続ができないケースがありました。
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 11 SEC_CASE_SENSITIVE_LOGON = false
CU2 に含まれている Oracle 向けの ODBC ドライバーはバージョンアップされているため、上記の設定が Oracle 側に行われていなくても接続が可能になりましたので、PolyBase で Oracle のデータの取り扱いやすさが向上しています。
もう一つの改善が Excel との接続です。
Excel の ODBC ドライバーは標準で含まれていませんので、Windows 版の SQL Server 2019 の環境に Excel 向けの ODBC ドライバーをインストールして、PolyBase からアクセスする必要があります。
Microsoft が提供している Excel の ODBC ドライバーとしては Access の再頒布可能コンポーネントに含まれている ODBC ドライバーがあります。
SQL Server 2019 CU1 までは、この ODBC ドライバーを使用して PolyBase 経由でアクセスをしようとすると、次のようなエラーとなってしまいアクセスすることができませんでした。
Msg 105082, Level 16, State 1, Line LineNumber
105082;Generic ODBC error: [Microsoft][ODBC Excel Driver]Optional feature not implemented
そのため、CData の Excel ODBC ドライバーを使用して接続をする等の方法をとる必要があったのですが、CU2 では Access の再頒布可能コンポーネントに含まれている Excel ODBC ドライバーで接続できるようになりました。
(Preview 版までは Access の再頒布可能コンポーネントが使用できており、途中で使用できなくなったのですが、これ不具合だったんですかね)
Access の再頒布可能コンポーネントに含まれる Excel ODBC ドライバーで接続する場合は次のようなクエリとなります。
CREATE EXTERNAL DATA SOURCE ExcelODBC WITH ( LOCATION = 'odbc://localhost', CONNECTION_OPTIONS = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=E:\temp\Book1.xlsx' ); GO DROP EXTERNAL TABLE ExcelTable GO CREATE EXTERNAL TABLE ExcelTable( C1 float, C2 NVARCHAR(255) COLLATE Japanese_XJIS_140_CI_AS, C3 datetime ) WITH ( LOCATION='[Sheet1$]', DATA_SOURCE=ExcelODBC ); GO
お手軽に PolyBase で Excel で接続ができるようになったのはうれしいですね。