本日、更新プログラム適用後、bcp.exe の出力メッセージが英語になる という記事の公開が行われました。
この記事の公開に伴い、本不具合の影響が「深刻」「重大」と表現しているコンテンツを X のタイムラインで見かけました。
更新プログラムの想定しなかった動作により、メッセージが英語になってしまうという不具合があったことは確かであり、その点については MS の不備になるかと。
本件がどのような事象により発生しているのかをまとめておきたいと思います。
日本の SQL Server チームの記事となるため、言語設定については日本語に焦点を当て記載されていますが、仕組みとしては「英語版以外の SQL Server」で言語の変更が行われるはずです。
個人的な所感としては「ODBC Driver のエラーメッセージのテキストで何らかの判断を実施している」処理が影響を受ける可能性がありますが、bcp.exe の正常処理 / エラーのステータスコードで判断している処理は影響を受けないはずですので、実施的な影響を受けたものは少ないのではないでしょうか。
また、本事象は 2024/04/09 以降に発生する可能性のあるものですが、私は、この事象により影響が発生したという内容の記事 / SNS の投稿は見たことがありません。
発生する事象
冒頭の記事のように事象が発生すると、bcp.exe のメッセージが英語で出力されるようになりますが、これは「一部のメッセージ」となり、全てのメッセージが英語で出力されるようになるわけではありません。
以下は実際に環境を作成して確認した画面となります。
bcp.exe の中で日本語 / 英語のメッセージが混在して表示されています。
今回の事象ですが、次の状態となります。
- bcp.exe: 日本語版
- ODBC Driver 17 for SQL Server: 英語版
bcp.exe については日本語版のものが継続して使用されるため、基本動作については変わりません。
そのため、bcp.exe の基本的な挙動についても変化はなく、CP932 / CP65001 のデータの出力にも影響は与えません。
また、bcp.exe 出力しているメッセージは日本語のままです。そのため、通常の処理で出力されるメッセージについては事象が発生しても変化はありません。
また、接続先の SQL Server から出力されるメッセージ ([Microsoft][ODBC Driver 17 for SQL Server][SQL Server]) についても、言語は変わりませんので、日本語の SQL Server を使用しているのであれば、日本語表記のままです。
以下は、「SQL Server に接続をしようとした後のメッセージ」であるため、このメッセージは ODBC の処理でも日本語で表示されます。
メッセージが変わるのは ODBC Driver が出力しているメッセージです。「ログインの失敗」は SQL Server に接続する前のメッセージであり、ODBC の処理としてエラーとなりますのでこのようなメッセージについては、ODBC Driver の言語に依存したメッセージとなるため、英語になります。
このように、今回発生している事象は「ODBC Driver 側で出力されるメッセージ」が英語のメッセージとなる挙動となり、bcp.exe のすべてのメッセージが英語のメッセージとなるわけではありません。
メッセージの種類によっては、日本語 (正確には SQL Server の言語のメッセージ) で出力されるものもあるため、すべてのメッセージが英語になるのではないということもポイントです。
今回の事象では「エラーが発生した場合の一部のメッセージが英語になる可能性」がありますが、全てのエラーではなく、通常のメッセージの言語には変化はないため、正常系のメッセージが変わるということはないはずです。また、エラーコードが変わるということもないため、bcp.exe の処理状況をエラーコード (or リターンコード) で判別しているものも影響は出ないはずです。
影響を受けるのは「SQL Server ODBC Driver が出力されているメッセージを日本語で判別する処理」になりますが、そのような対応をしているコードは少ないのではないでしょうか。
懸念としてあったのが「bcp.exe の処理メッセージの最後に出力される行数の情報を使用」するというものですが (実際に昔このような処理を書いたことがあります)、これについては、bcp.exe で出力されているものでメッセージに変化はないため影響は受けません。
このような状態となる事象で「深刻」「重大」と言われるような影響が発生することがあるのかは疑問が残りました。
今回の事象が発生する可能性のある SQL Server のバージョン
SQL Server 2019 / 2022 でしか確認していないため、他のバージョンではどのバージョンからが影響するのかが不明ですが、2019 / 2022 については次の更新プログラム以降が該当します。
- SQL Server 20219 CU25
- SQL Server 2022 CU12
どちらのバージョンの更新プログラムも「2024/04/09」にリリースされたものとなります。そのため、この問題は直近で発生したものではありません。
メッセージが変わったことで影響を受けるシステム / 運用がゼロであったということはないかと思いますが、この問題自体は去年の段階から発生していたものです。
「深刻「重大」と言われるような問題が発生していたのであれば、冒頭の記事が公開される前から、影響を受けたという報告を 1 件ぐらいは見そうですが、そのような報告は見たことはありませんでした。
事象の発生に起因したと考えられる要因
冒頭の記事には次のように記載されています。
本事象は、ODBCドライバーの修正が含まれた更新プログラムを適用する場合、更新プログラムに含まれるODBCドライバーのインストーラーは各言語版ではなく英語版での提供となり、更新プログラムを適用時にODBCドライバーの日本語リソースファイルが削除されるために発生します。
SQL Server の更新プログラムは「多言語版のみ提供」されていますので、「日本語版の更新プログラムに英語版が含まれてしまった」ということではなく、「多言語版の更新プログラムに ODBC ドライバーの更新プログラムが英語版のみ提供されていた」ということがポイントとなります。
SQL Server を日本語版でインストールすると、サーバーには「日本語版の SQL Server のODBC ドライバー」がインストールされた状態となります。
この状態で、「英語版の SQL Server の ODBC ドライバー」をインストールすると、英語版がインストールされることになりますので「日本語版のリソースファイルが削除される」という事象が発生します。
このインストーラーとしては「MSODBCSQL.MSI」が該当するのですが、個のインストーラーにつていては、SQL Server 2019 の更新プログラムであれば「CU19」から含まれるようになっていたようです。
しかし、CU19~CU24 をインストールしても本事象は発生しません。
これらのバージョンで含まれている 「MSODBCSQL.MSI」ですが、バージョン「17.10.5.1」となっているようです。
このバージョンは SQL Server のインストーラーに含まれるものと同じであり、バージョンの変化がなかったため、更新プログラムのインストーラーに含まれるようになった CU19~CU24 では更新されずに影響を受けていなかった可能性があるかと。
CU25 になるとバージョンが「17.10.6.1」に更新されます。これによりバージョンアップの必要があり英語版の ODBC ドライバーがインストールされるようになったことで、日本語リソースファイルが削除されるという事象が発生しているのではないでしょうか。
17.10.6.1 が使用されるようになったのは Microsoft ODBC Driver 17 for SQL Server 用のセキュリティ更新プログラムについて: 2024 年 4 月 9 日 の対応からとなります。
Microsoft の CVE の情報としては SQL Server 用 Microsoft ODBC ドライバーのリモートでコードが実行される脆弱性 から確認できます。
この CVE の対応として、次の更新プログラムが提供されるようになりましたので、SQL Server 2019 CU25 / SQL Server 2022 CU12 (またはこの修正向けの GDR) をインストールすると事象が再現します。
「MSODBCSQL.MSI」は 1033 (英語) のみが更新プログラムに含まれており、それ以外の言語のものは含まれていません。
そのため、本事象は「英語以外」の SQL Server で発生しますので、日本語に限定された問題ではないと考えています。
更新プログラムにすべての言語の「MSODBCSQL.MSI」が含まれるようになる可能性は低いかと思いますので、今後も SQL Server の更新プログラムの中に新しいバージョンの SQL Server ODBC Driver が含まれるようになると、本事象が発生するかもしれません。
他の影響の考慮
冒頭の記事は bcp.exe に焦点を当てた内容ですので bcp.exe が DB にアクセスするために使用している、ODBC Driver について記載されています。
同様の事象が「Microsoft OLEDB Driver for SQL Server」「SQL Server 2012 Native Client」(SNAC) についても、英語版のインストーラーで更新が行われているため、これらの日本語リソースファイルについても削除されています。
- Microsoft ODBC Driver 17 for SQL Server (17.10.6.1)
- Microsoft OLE DB Driver for SQL Server (18.7.4.0)
OLEDB を使用している場合は、OLEDB の日本語リソースファイルのインストールも検討したほうが良いかもしれませんね。
SNAC の 11.4.7515.2 のインストーラーが見当たらず、こちらについては日本語リソースの継続利用は難しいかもしれません。