MarkLogic: SQL-NOCOLUMN カラムが見つからないエラー

この記事では、MarkLogic の「SQL-NOCOLUMN」エラーに関する情報を説明します。

Date Entered: 3/10/2020    Last Updated: 3/10/2020    Author: James Baggs

この記事では、MarkLogic インスタンスからデータをクエリする際に CData ドライバーを通じて表示されることがある「Server error [SQL state: 08000]: SQL-NOCOLUMN: Column not found: main.employees.FirstName」というエラーメッセージについて説明します。この例では、Main はスキーマ名、Employees はテーブル名、FirstName はカラム名を表しています。

このエラーが発生する2つの原因

  1. SELECT ステートメント内のカラムがテーブルに存在しない
  2. この原因は比較的わかりやすく、特定やトラブルシューティングも容易です。MarkLogic の場合、CData は入力された SQL クエリに対して若干の解析と変換を行った後、SQL ステートメントを MarkLogic に送信します。そのため、この問題を解決するには、実際にテーブルに存在するカラムを含むようにクエリを修正するだけで済みます。例えば以下のようになります:

    (invalid) SELECT SomeInvalidColumn FROM Customers.Purchases
    (valid)   SELECT FirstName FROM main.employees

  3. カラムが一時的にオフラインになっている
  4. この問題の原因がカラムの「オフライン」状態である場合、問題は一時的なものです。MarkLogic のドキュメントには、再インデックス処理中にカラムが一時的にオフラインになるケースが記載されています:https://docs.marklogic.com/guide/sql/creating-template-views

トラブルシューティングと問題の原因特定

Verbosity を 4 に設定した CData ログファイルを確認すると、上記のどちらが問題の原因かについてより詳しい情報を得ることができます。ログファイルは、以下のように接続文字列プロパティに値を追加することで取得できます:

Logfile=C:\Users\Public\Documents\logfile.txt
Verbosity=4
ログファイル内には、CData が MarkLogic の sys_columns テーブルからカラムのメタデータを取得するセクションが記録されています:
2020-01-01T09:50:43.696-04:00	3	[Connection: 6] Query to send: SELECT "schema", "table", "name", "type", "notnull", "pk" FROM "sys"."sys_columns" WHERE ("schema" = 'main') AND ("table" = 'employees')
2020-01-01T09:50:43.698-04:00	3	[Connection: 6]DataIn, Length: 409
2020-01-01T09:50:43.699-04:00	4	[Connection: 6]
54 00 00 00 94 00 06 73 63 68 65 6D 61 00 00 00
00 00 00 00 00 00 04 13 FF FF 00 00 00 00 00 00
74 61 62 6C 65 00 00 00 00 00 00 01 00 00 04 13
FF FF 00 00 00 00 00 00 6E 61 6D 65 00 00 00 00
00 00 02 00 00 04 13 FF FF 00 00 00 00 00 00 74
79 70 65 00 00 00 00 00 00 03 00 00 04 13 FF FF
00 00 00 00 00 00 6E 6F 74 6E 75 6C 6C 00 00 00
00 00 00 04 00 00 00 10 00 04 00 00 00 00 00 00
70 6B 00 00 00 00 00 00 05 00 00 00 10 00 04 00
00 00 00 00 00 44 00 00 00 3A 00 06 00 00 00 04
6D 61 69 6E 00 00 00 09 65 6D 70 6C 6F 79 65 65
73 00 00 00 0A 45 6D 70 6C 6F 79 65 65 49 44 00
00 00 03 69 6E 74 00 00 00 01 31 00 00 00 01 30
44 00 00 00 3C 00 06 00 00 00 04 6D 61 69 6E 00
00 00 09 65 6D 70 6C 6F 79 65 65 73 00 00 00 09
46 69 72 73 74 4E 61 6D 65 00 00 00 06 73 74 72
69 6E 67 00 00 00 01 31 00 00 00 01 30 44 00 00
00 3B 00 06 00 00 00 04 6D 61 69 6E 00 00 00 09
65 6D 70 6C 6F 79 65 65 73 00 00 00 08 4C 61 73
74 4E 61 6D 65 00 00 00 06 73 74 72 69 6E 67 00
00 00 01 31 00 00 00 01 30 44 00 00 00 3B 00 06
00 00 00 04 6D 61 69 6E 00 00 00 09 65 6D 70 6C
6F 79 65 65 73 00 00 00 08 50 6F 73 69 74 69 6F
6E 00 00 00 06 73 74 72 69 6E 67 00 00 00 01 31
00 00 00 01 30 43 00 00 00 0D 53 45 4C 45 43 54
20 34 00 5A 00 00 00 05 49
2020-01-01T09:50:43.699-04:00	1	[Connection: 6]	Executed column schema query: [employees], Success: 4 results (3 ms).
DataIn セクションから空白文字を除去し、16進数データリーダーツールを使用すると、MarkLogic から返されたカラムの文字列データを確認できます:
schema	table	name	type	notnull	pk
main	employees	EmployeeID 	int 	1	0
main	employees	FirstName 	string 	1 	0
main	employees 	LastName	string 	1 	0
main	employees	Position 	string 	1 	0

この例では、FirstName が MarkLogic のメタデータで正しく返されており、送信クエリ内でもスペルとクォートエスケープが正しく処理されていることから、SQL-NOCOLUMN エラーは MarkLogic サーバーの再インデックス処理が原因であり、一時的な問題であると結論づけることができます。

残念ながら、MarkLogic API の sys_columns を通じてカラムが無効化されているかどうかを識別できる情報はありません(そのため、CData からその情報を表示することはできません)。また、カラムが一時的に無効化される期間に関する情報も CData では把握しておりません。


We appreciate your feedback.  If you have any questions, comments, or suggestions about this entry, please contact our support team at support@cdata.co.jp.