ArcGIS Server には、REST または SOAP を通してマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスを操作する開発者に対して、標準化された SQL クエリの使用を強制するセキュリティ オプションが用意されています。 これを使用すると、開発者とアプリケーションにとって、ArcGIS Server サービスのクエリが容易になるとともに、SQL インジェクション攻撃を防ぐことができます。 標準化されたクエリはデフォルトで適用されますが、サーバー管理者は無効化することができます。
標準化されたクエリ
標準化されたクエリが有効な場合、ArcGIS Server によって標準の構文がチェックされ、データベース固有の関数や構文は使用できなくなります。 データベース固有の関数や構文を現在使用しているアプリケーション開発者は、アプリケーションのコード内にある WHERE 句を更新して、ArcGIS がサポートする一般的な SQL 構文を使用する必要があります。 また、標準化されたクエリのチェックを無効化するように ArcGIS Server を設定することもできます。
標準化されたクエリの制限
標準化されたクエリは ArcGIS Server サイト全体に適用されます。サービスによって有効と無効を使い分けることはできません。
標準化されたクエリは、異なるワークスペース間の結合ではサポートされていません。 また、OLE DB 接続ファイルを通じてアクセスされるデータベース テーブルはサポートされていません。 これらのソースがサービスのデータに含まれる場合、データを参照するのに別の方法を使用する必要があります。
たとえば、POP_2010 = (SELECT min(POP_2010) FROM counties のような WHERE 句のサブクエリはサポートされていません。
標準化されたクエリの作成
このトピックの最後にある表には、ArcGIS Server でサポートされている SQL 関数が掲載されています。 この表は、アプリケーション内でマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスに対して使用できる標準化されたクエリを生成するために使用可能な SQL 関数を理解するのに役立ちます。
標準化されたクエリが ArcGIS Server で使用されているかどうかの判断
前述したように、標準化されたクエリはデフォルトで有効になっていて、ArcGIS Server サイトのすべてのマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスに適用されます。 サーバー管理者は ArcGIS Server Administrator Directory にサイン インし、[system] > [properties] > [update] の順に参照して、標準化されたクエリが使用されているかどうかを確認することができます。 [System Properties] ダイアログ ボックスにシステム プロパティが表示されないか、{"standardizedQueries": "true"} が表示されている場合、標準化されたクエリは有効になっています。
別の方法として、管理者、アプリケーション開発者、およびクライアントは、ArcGIS Server Services Directory を通じてサービスにアクセスし、[Use Standardized Queries] プロパティを調べることで、標準化されたクエリが使用されているかどうかを確認できます。 マップ、フィーチャ、および WFS サービスの場合、サービスの特定のレイヤーまたはテーブル (https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/service type/0 など) にアクセスすることで、プロパティを調べることができます。 イメージ サービスの場合、プロパティはサービスのエンドポイント (https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/ImageServer など) にあります。
ArcGIS Server Administrator Directory へアクセスする手順や、標準化されたクエリを無効化する方法については、このトピックの次のセクションをご参照ください。
標準化されたクエリの無効化
アプリケーションでデータベース固有の WHERE 句ステートメントを使用する必要がある場合、ArcGIS Server Administrator Directory にアクセスして、標準化されたクエリを無効化することができます。 手順は次のとおりです。
注意:
このセキュリティ オプションを無効にすることで、サイトは SQL インジェクション攻撃に対して脆弱になります。
注意:
標準化されたクエリの無効化は、ArcGIS Enterprise のホスト フィーチャ サービスではサポートされていません。
- Administrator Directory を開き、サイトに対する管理者権限を持つユーザーとしてサイン インします。
通常、ArcGIS Server Administrator Directory は https://gisserver.domain.com:6443/arcgis/admin で使用できます。
- [system] > [properties] > [update] の順にクリックします。
- [Operation - update] ページで、[System Properties] ダイアログ ボックスに次の文字列を入力します。
{"standardizedQueries": "false"} - [Update] をクリックします。
- ArcGIS Server を再起動します。
これで、標準化されていないクエリを使用して、マップ、フィーチャ、イメージ、および WFS サービスへのリクエストを送信できるようにサイトが構成されました。 標準化されたクエリをもう一度有効にするには、上記の手順を繰り返し、standardizedQueries プロパティを true に設定します。
ArcGIS Server でサポートされている SQL 関数
ArcGIS Server でサポートされている SQL 関数と各関数の構文を次の表に示します。 アプリケーション内で次の関数と構文が使用されている場合、ArcGIS Server は、サービスで使用されているデータベースの仕様に合わせてこれらの関数を変換します。
これらの関数は、ホスト Web レイヤーではなく、ArcGIS Server Web サービスに適用されます。
| 関数タイプ | 関数 | 説明 | 例 |
|---|---|---|---|
Date | CURRENT_DATE | セッションのタイム ゾーンにおける現在の日付を返します。 注意:ホストされたセッションのタイム ゾーンは常に UTC です。 | Datefield < CURRENT_DATE |
CURRENT_TIME | セッションのタイム ゾーンにおける現在の時間を返します。 注意:ホストされたセッションのタイム ゾーンは常に UTC です。 | Timestampfield < CURRENT_TIME | |
CURRENT_TIMESTAMP | 現在の現地時間を返します。 注意:ホストされたセッションのタイム ゾーンは常に UTC です。 | Timestampfield < CURRENT_TIMESTAMP | |
EXTRACT(extract_field FROM extract_source) | extract_source から extract_field の部分を返します。 extract_field 引数には、YEAR、MONTH、DAY、HOUR、MINUTE、または SECOND のいずれかのキーワードを指定できます。 | 11 月のすべての行を検索します。 EXTRACT(MONTH FROM Datefield) = 11 | |
算術演算 | ABS(numeric_exp) | 指定した数値式の絶対値 (正の値) を返します。 | ABS(-99)=90 |
ACOS(numeric_exp) | 角度をラジアンで示した numeric_exp の逆余弦を返します。 | ||
ASIN(numeric_exp) | 角度をラジアンで示した numeric_exp の逆正弦を返します。 | ||
ATAN(numeric_exp) | 角度をラジアンで示した numeric_exp の逆正接を返します。 | ||
CEILING(numeric_exp) | 指定した数値式以上で、最も小さな整数を返します。 | numeric_exp 以上の最小の整数が目的の値と等しいすべての行を検索します: CEILING(ratings)=90 | |
COS(numeric_exp) | 角度をラジアンで示した numeric_exp の余弦を返します。 | ||
COSH(numeric_exp) | 角度をラジアンで示した numeric_exp の双曲線余弦を返します。 | ||
FLOOR(numeric_exp) | 指定した数値式以下で、最も大きな整数を返します。 | numeric_exp 以下の最大の整数が目的の値と等しいすべての行を検索します: FLOOR(ratings)=75 | |
LOG(float_exp) | 指定した浮動小数点式の自然対数を返します。 | ||
LOG10(float_exp) | 指定した浮動小数点式の常用対数を返します。 | ||
MOD(integer_exp1, integer_exp2) | integer_exp2 で除算された integer_exp1 の余りを返します。 | integer_exp1 が偶数であるすべての行を検索します: MOD(userid,2)=0 | |
POWER(numeric_exp, integer_exp) | 指定した式の、指定した累乗の値を返します。 | POWER(Numericfield, 2) = 16 | |
ROUND(numeric_exp, integer_exp) | 指定した長さまたは精度に丸めた数値を返します。 | ||
SIGN(numeric_exp) | numeric_exp の数学的符号を表す値を返します。 例: 0 (ゼロ)、1 (正の値)、-1 (負の値)。 | numeric_exp が負の数であるすべての行を検索します: SIGN(elevation)=-1 | |
SIN(numeric_exp) | 角度をラジアンで示した numeric_exp の正弦を返します。 | ||
SINH(numeric_exp) | 角度をラジアンで示した numeric_exp の双曲線正弦を返します。 | ||
TAN(numeric_exp) | 角度をラジアンで示した numeric_exp の正接を返します。 | ||
TANH(numeric_exp) | 角度をラジアンで示した numeric_exp の双曲線正接を返します。 | ||
TRUNCATE(numeric_exp, integer_exp) | 値を四捨五入せずに、小数点の右 integer_exp 桁に切り捨てられた numeric_exp を返します。 | TRUNCATE(0.5463111445,3)=0.546 | |
集約 | AVG(numeric_exp, integer_exp) | numeric_exp の計算された平均値を返します。 | outStatistics=[{"statisticType": "avg","onStatisticField": "pop1997","outStatisticFieldName": "avg_pop1997"}] |
COUNT(string_exp OR ASTERISK) | string_exp を保持する行の数を返します。 | outStatistics=[{"statisticType": "count","onStatisticField": "p_females","outStatisticFieldName": "count_p_females"}] | |
MAX(numeric_exp) MAX(string_exp) MAX(datetime_exp) | numeric_exp、string_exp、または datetime_exp の最大値を返します。 | すべての numeric_exp 行にわたる最大値を検索します: outStatistics=[{"statisticType": "max","onStatisticField": "p_males","outStatisticFieldName": "max_p_males"}] | |
MIN(numeric_exp) MIN(numeric_exp) MIN(numeric_exp) | numeric_exp、string_exp、または datetime_exp の最小値を返します。 | すべての numeric_exp 行にわたる最小値を検索します: outStatistics=[{"statisticType": "min","onStatisticField": "pop1990","outStatisticFieldName": "min_pop1990"}] | |
STDDEV(numeric_exp) | numeric_exp の値の標準偏差を返します。 | すべての numeric_exp 行にわたる標準偏差値を検索します: outStatistics=[{"statisticType": "stddev","onStatisticField": "eval_score","outStatisticFieldName": "stddev_eval_score"}] | |
SUM(numeric_exp) | numeric_exp の値の合計を返します。 | すべての numeric_exp 行にわたる値の合計を検索します: outStatistics=[{"statisticType": "sum","onStatisticField": "p_females","outStatisticFieldName": "sum_p_females"}] | |
VAR(numeric_exp) | numeric_exp の値の分散を返します。 | すべての numeric_exp 行にわたる分散値を検索します: outStatistics=[{"statisticType": "var","onStatisticField": "pop1980","outStatisticFieldName": "var_pop1980"}] | |
String | CHAR_LENGTH(string_exp) | 入力文字列の長さ (文字数) を返します。 | string_exp の長さが 10 より大きいすべての行を検索します: CHAR_LENGTH(string_exp) > 10 |
CONCAT(string_exp1, string_exp2) | 複数の文字列を連結した文字列を返します。 | 連結文字を指定した連結バージョンの string_exp1 と string_exp2 を出力します: OutFields=CONCAT(id,CONCAT(I-,name)) | |
LOWER(string_exp) | すべての大文字を小文字に変換した string_exp に等しい文字列を返します。 デフォルト ロケールはデータベースのロケールです。 | 大文字/小文字に関係なく、値が目的の文字列であるすべての行を検索します: LOWER(string_field) = "lowered_string" | |
POSITION(cahracter_exp1 IN character_exp2) | character_exp2 の最初の character_exp1 の整数位置を返します。 | 最初の文字が 'I' であるすべての行を検索します: POSITION('I' IN state_name) = 1 | |
SUBSTRING(string_exp FROM start FOR length) SUBSTRING(string_exp, integer_exp_start, integer_exp_length) | start で指定した文字位置から length で指定した文字数の文字列を string_exp から取得して返します。 | Stringfield の値から、最初の 2 文字が Ch である行をすべて検索します: SUBSTRING(Stringfield FROM 1 FOR 2)='Ch' | |
TRIM(BOTH|LEADING|TRAILING trim_character FROM string_exp) | string_exp の先頭、末尾、または両端から trim_character を削除した文字列を返します。 | 不要な接頭辞と接尾辞なしで string_field を出力します: OutFields=TRIM(BOTH '__' FROM string_exp) | |
UPPER(string_exp) | すべての小文字を大文字に変換した string_exp の文字列に等しい文字列を返します。 デフォルト ロケールはデータベースのロケールです。 | UPPER(name) = "TEXAS" | |
その他 | CAST(expression AS target_data_type) | target_data_type に変換された式を返します。 | 指定したデータ タイプに変換された式が目的の値に等しいすべての行を検索します: CAST(parcel_id AS INT)=38456 |
COALESCE(expression1,expression2,...) | 式のリストから最初の非 NULL 値を返します。 | 最初の非 NULL 値が指定の値であるすべての行を検索します: COALESCE(preferred_name, nickname, first_name) = 'MyName' | |
CURRENT_USER | 現在ログインしているユーザーを返します。 注意:現在のデータベース ユーザーは返されません。 | 現在ログインしているユーザーが唯一の作業者であるすべての行を検索します。 workerfield=CURRENT_USER他の作業者の有無にかかわらず、現在ログインしているユーザーが作業者としてリストされているすべての行を検索します。 position(CURRENT_USER in workerfield) > 0 | |
NULLIF(expression1,expression2) | 2 つの式を比較します。 これらの式が等しい場合は、NULL を返します。 これらの式が等しくない場合は、expression1 を返します。 | expression1 と expression2 間の NULLIF 比較の結果を出力します: outFields=NULLIF(units_sold, unit_sell_goal) |