Применение стандартизированных SQL-запросов
ArcGIS Server включает опцию безопасности, которая принуждает разработчиков при работе с картографическим сервисом, сервисами объектов, изображений и WFS через REST или SOAP использовать стандартизированные SQL-запросы. Это позволяет упростить запросы разработчиков и приложений к сервисам ArcGIS Server и помогает предотвращать SQL-атаки. Стандартизированные запросы используются по умолчанию, однако, они могут быть отключены администратором сервера.
Стандартизированные запросы
При активации стандартизированных запросов, ArcGIS Server проверяет стандартный синтаксис и не допускает использования функций и синтаксиса, специфичных для баз данных. Если вы являетесь разработчиком приложений и в настоящее время используете функции и синтаксис, специфичные для базы данных, вы должны обновить предложения where в коде вашего приложения, чтобы использовать стандартный синтаксис SQL, поддерживаемый ArcGIS. Либо можно отключить для ArcGIS Server проверку стандартизированных запросов.
Ограничения стандартизированных запросов
Стандартизированные запросы применяются ко всему сайту ArcGIS Server и не могут быть включены для одних сервисов и выключены для других.
Стандартизированные запросы не поддерживаются в соединениях между различными рабочими областями. Также не поддерживаются таблицы базы данных, доступные с помощью файла подключения OLE DB. Если данные сервиса содержат такие источники, вы должны использовать альтернативные методы для построения ссылок на данные.
Подзапросы, такие как выражение where, например, POP_2010 = (SELECT min(POP_2010)) FROM counties, не поддерживаются.
Создание стандартизированного запроса
В таблице в конце этого раздела описано, какие функции SQL поддерживаются в ArcGIS Server. Вы можете использовать эту таблицу, чтобы понять, какие функции SQL можно использовать для создания стандартизированных запросов, которые можно использовать для картографических сервисов, сервисов объектов, изображений и WFS в ваших приложениях.
Определение использования стандартизированных запросов в ArcGIS Server
Как указано выше, стандартизированные запросы включены по умолчанию и применяются ко всем картографическим сервисам, сервисам объектов, изображений и WFS на сайте ArcGIS Server. Администратор сервера может убедиться, что используются стандартные запросы, войдя в ArcGIS Server Administrator Directory и перейдя в система > свойства > обновить. Если в диалоговом окне **Свойства системы **отсутствует свойство системы или указано {"standardizedQueries": "true"}, значит, стандартизированные запросы включены.
Или администраторы, разработчики приложений и клиенты могут проверить, используются ли стандартизированные запросы, открыв сервис с помощью ArcGIS Server Services Directory и просмотрев свойство Использовать стандартизированные запросы. Для картографических сервисов, сервисов объектов и WFS свойство можно просмотреть, обратившись к определенному слою или таблице в сервисе, например, https://gisserver.example.com:6443/arcgis/rest/services/folder/service/service type/0. Для сервисов изображений свойство доступно в конечной точке сервиса, например, https://gisserver.example.com:6443/arcgis/rest/services/folder/service/ImageServer.
Для получения инструкций о порядке доступа к Administrator Directory и выключении стандартизированных запросов обратитесь к следующей части данного раздела.
Отключение стандартизированных запросов
Если вам нужно использовать в приложении выражения where, специфичные для базы данных, вы можете отключить стандартизированные запросы в ArcGIS Server Administrator Directory. Для этого проделайте следующее.
Внимание:
Отключив опцию безопасности, вы сделаете ваш сайт более уязвимым по отношению к SQL-атакам.
Примечание:
Отключение стандартизированных запросов в размещенных сервисах объектов в ArcGIS Enterprise не поддерживается.
Откройте Administrator Directory и войдите в систему с правами администратора вашего сайта.
Administrator Directory обычно доступна по адресу
https://gisserver.example.com:6443/arcgis/admin.Щелкните система > свойства > обновить.
На странице Operation (операция) – update (обновить) введите в диалоговом окне Свойства системы (System Properties) следующую строку:
{"standardizedQueries": "false"}Щелкните Обновить.
Перезапустите ArcGIS Server.
Теперь ваш сайт позволяет пользователям посылать нестандартизированные запросы к картографическим сервисам, сервисам объектов, изображений и WFS. Чтобы снова включить стандартизированные запросы, повторите описанные выше шаги еще раз, но установите для свойства standardizedQueries значение true.
Поддерживаемые SQL-функции в ArcGIS Server
В следующем списке приведены поддерживаемые SQL-функции и их синтаксис. При использовании следующих функций и синтаксиса в приложениях, ArcGIS Server конвертирует их в соответствии со спецификациями базы данных, используемой в этом сервисе.
Эти функции применяются к веб-сервисам ArcGIS Server, а не к размещенным веб-слоям.
|
Тип функции |
Функция |
Описание |
Пример |
|---|---|---|---|
|
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_field из extract_source. Аргументом extract_field может быть одно из следующих ключевых слов: YEAR, MONTH, DAY, HOUR, MINUTE или SECOND. |
Поиск по всем строкам, начиная с ноября: 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_exp1 на integer_exp2. |
Найти все строки, где 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) |
Возвращает numeric_exp, усеченное до integer_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"}] |
|
|
Строка |
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_exp1 в character_exp2. |
Найти все строки, где первым символом является 'I': POSITION('I' IN state_name) = 1 |
|
|
SUBSTRING(string_exp FROM start FOR length) SUBSTRING(string_exp, integer_exp_start, integer_exp_length) |
Возвращает символьную строку, извлекаемую из string_exp, начинающуюся с символа, номер которого определяется аргументом start, а длина строки составляет столько символов, сколько указано в аргументе length. |
Поиск всех строк, в которых первые два символа значений в Stringfield равны 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,...) |
Возвращает первое непустое значение из списка выражений. |
Найти все строки, где первое непустое значение является указанным значением: COALESCE(preferred_name, nickname, first_name) = 'MyName' |
|
|
CURRENT_USER |
Возвращает пользователя, который в данный момент вошел в систему. Примечание:Это не возвращает текущего пользователя базы данных. |
Найти все строки, где пользователь, который вошел в систему в данный момент, является единственным работником. workerfield=CURRENT_USER Найти все строки, где пользователь, который вошел в систему в данный момент, является работником, независимо от того, есть ли другие работники. position(CURRENT_USER in workerfield) > 0 |
|
|
NULLIF(expression1,expression2) |
Сравнивает два выражения. Если они равны, возвращает NULL. Они не равны, возвращает expression1. |
Выводит результат сравнений outFields=NULLIF(units_sold, unit_sell_goal) |