Skip to main content

Aplicar las consultas SQL estandarizadas

ArcGIS Server incluye una opción de seguridad que obliga a los desarrolladores a utilizar consultas SQL estandarizadas cuando trabajan con servicios de mapas, entidades, imágenes y WFS a través de REST o SOAP. Esto facilita a los desarrolladores y a las aplicaciones la consulta de los servicios de ArcGIS Server y contribuye a prevenir los ataques de inyección SQL. Las consultas estandarizadas están activadas de forma predeterminada, pero el administrador del servidor puede deshabilitarlas.

Consultas estandarizadas

Cuando se habilitan las consultas estandarizadas, ArcGIS Server comprueba que se respete la sintaxis estándar y no permite el uso de funciones ni sintaxis específicas de la base de datos. Si, como desarrollador de aplicaciones, utiliza actualmente la sintaxis y las funciones específicas de la base de datos, deberá actualizar las cláusulas WHERE en el código de la aplicación para usar la sintaxis de SQL común admitida por ArcGIS. Como alternativa, puede deshabilitar que ArcGIS Server compruebe que las consultas sean estandarizadas.

Limitaciones de las consultas estandarizadas

Las consultas estandarizadas se aplican a todo el sitio de ArcGIS Server; no es posible habilitarlas para algunos servicios y deshabilitarlas para otros.

Las consultas estandarizadas no se admiten en uniones entre espacios de trabajo diferentes. Además, no se admiten las tablas de base de datos a las que se accede mediante un archivo de conexión OLE DB. Si sus datos de servicio contienen estos orígenes, tendrá que usar métodos alternativos para hacer referencia a sus datos.

No se admiten subconsultas como cláusula WHERE; por ejemplo, POP_2010 = (SELECT min(POP_2010)) FROM counties.

Escribir una consulta estandarizada

La tabla situada al final de este tema describe las funciones SQL compatibles con ArcGIS Server. Puede usar esta tabla como ayuda para saber qué funciones SQL se pueden usar para generar consultas estandarizadas que se puedan utilizar con servicios de mapas, entidades, imágenes y WFS en sus aplicaciones.

Determinar si ArcGIS Server usa consultas estandarizadas

Tal como se ha indicado anteriormente, las consultas estandarizadas están habilitadas de forma predeterminada y se aplican a todos los servicios de mapas, entidades, imágenes y WFS en el sitio de ArcGIS Server. No obstante, un administrador del servidor puede comprobar si se están utilizando consultas estandarizadas iniciando sesión en el Directorio de administrador de ArcGIS Server y examinando sistema > propiedades > actualizar. Si no aparece ninguna propiedad del sistema en el cuadro de diálogo Propiedades del sistema o si {"standardizedQueries": "true"} no existe, las consultas estandarizadas están activadas.

Como alternativa, los administradores, los desarrolladores de aplicaciones y los clientes pueden comprobar que se están utilizando consultas estandarizadas accediendo a un servicio a través del Directorio de servicios de ArcGIS Server y consultando la propiedad Utilizar consultas estandarizadas. En el caso de los servicios de mapas, de entidades y WFS, se puede consultar la propiedad accediendo a una capa o tabla concreta del servicio, por ejemplo, https://gisserver.example.com:6443/arcgis/rest/services/folder/service/service type/0. En el caso de los servicios de imágenes, la propiedad está disponible en el extremo del servicio, por ejemplo, https://gisserver.example.com:6443/arcgis/rest/services/folder/service/ImageServer.

Puede consultar las instrucciones para acceder al Directorio de administrador o información sobre cómo inhabilitar las consultas estandarizadas en la sección siguiente de este tema.

Deshabilitar las consultas estandarizadas

Si necesita utilizar cláusulas WHERE específicas de la base de datos en su aplicación, puede deshabilitar las consultas estandarizadas accediendo al Directorio de administrador de ArcGIS Server. Para ello, siga las instrucciones siguientes.

Precaución:

Al deshabilitar esta opción de seguridad, su sitio se vuelve más vulnerable a los ataques de inyección SQL.

Nota:

No se puede deshabilitar las consultas estandarizadas para los servicios de entidades alojados en ArcGIS Enterprise.

  1. Abra el Directorio de administrador e inicie sesión con un usuario que tenga permisos administrativos para el sitio.

    Por lo general, el Directorio de administrador está disponible en https://gisserver.example.com:6443/arcgis/admin.

  2. Haga clic en Sistema > Propiedades > Actualizar.

  3. En la página Operación - actualizar, introduzca la cadena siguiente en el cuadro de diálogo Propiedades del sistema:

    {"standardizedQueries": "false"}
    
  4. Haga clic en Actualizar.

  5. Reinicie ArcGIS Server.

Ahora el sitio está configurado para permitir a los usuarios enviar solicitudes a servicios de mapas, entidades, imágenes y WFS utilizando consultas no estándar. Para volver a habilitar las consultas estandarizadas, repita las instrucciones anteriores, pero establezca la propiedad standardizedQueries en true.

Funciones SQL compatibles con ArcGIS Server

La siguiente lista muestra qué funciones SQL son compatibles con ArcGIS Server y la sintaxis de cada una de ellas. Cuando se utilicen las siguientes sintaxis y funciones en las aplicaciones, ArcGIS Server las convertirá para adaptarlas a la especificación de la base de datos utilizada por el servicio.

Estas funciones se aplican a los servicios web de ArcGIS Server, no a las capas web alojadas.

Tipo de función

Función

Descripción

Ejemplo

Fecha

CURRENT_DATE

Devuelve la fecha actual en la zona horaria de la sesión.

Nota:

La zona horaria de la sesión alojada siempre está en UTC.

Datefield < CURRENT_DATE

CURRENT_TIME

Devuelve la hora actual en la sesión de tiempo uno.

Nota:

La zona horaria de la sesión alojada siempre está en UTC.

Timestampfield < CURRENT_TIME

CURRENT_TIMESTAMP

Devuelve la hora local actual.

Nota:

La zona horaria de la sesión alojada siempre está en UTC.

Timestampfield < CURRENT_TIMESTAMP

EXTRACT(extract_field FROM extract_source)

Devuelve la porción extract_field de extract_source.

El argumento extract_field puede ser una de las siguientes palabras clave: YEAR, MONTH, DAY, HOUR, MINUTE o SECOND.

Buscar todas las filas del mes de noviembre:

EXTRACT(MONTH FROM Datefield) = 11

Matemática

ABS(numeric_exp)

Devuelve el valor absoluto (positivo) de la expresión numérica especificada.

ABS(-99)=90

ACOS(numeric_exp)

Devuelve el arcocoseno de numeric_exp como un ángulo, expresado en radianes.

ASIN(numeric_exp)

Devuelve el arcoseno de numeric_exp como un ángulo, expresado en radianes.

ATAN(numeric_exp)

Devuelve el arcotangente de numeric_exp como un ángulo, expresado en radianes.

CEILING(numeric_exp)

Devuelve el número entero más pequeño que sea mayor o igual a la expresión numérica especificada.

Busca todas las filas en las que el entero máximo de numeric_exp sea igual al valor deseado:

CEILING(ratings)=90

COS(numeric_exp)

Devuelve el coseno de numeric_exp como un ángulo, expresado en radianes.

COSH(numeric_exp)

Devuelve el coseno hiperbólico de numeric_exp como un ángulo, expresado en radianes.

FLOOR(numeric_exp)

Devuelve el entero más grande menor o igual que la expresión numérica especificada.

Busque todas las filas en las que el entero de planta de numeric_exp sea igual al valor deseado:

FLOOR(ratings)=75

LOG(float_exp)

Devuelve el logaritmo natural de la expresión flotante especificada.

LOG10(float_exp)

Devuelve el logaritmo en base 10 de la expresión flotante especificada.

MOD(integer_exp1, integer_exp2)

Devuelve el restante de integer_exp1 dividido por integer_exp2.

Busca todas las filas en las que integer_exp1 sea un número par:

MOD(userid,2)=0

POWER(numeric_exp, integer_exp)

Devuelve el valor de la expresión especificada a la potencia especificada.

POWER(Numericfield, 2) = 16

ROUND(numeric_exp, integer_exp)

Devuelve un valor numérico redondeado a la longitud o precisión especificada.

SIGN(numeric_exp)

Devuelve un indicador del signo matemático de numeric_exp.

Ejemplos: 0 para cero, 1 para positivo, -1 para negativo.

Busque todas las filas en las que numeric_exp sea un número negativo:

SIGN(elevation)=-1

SIN(numeric_exp)

Devuelve el seno de numeric_exp como un ángulo, expresado en radianes.

SINH(numeric_exp)

Devuelve el seno hiperbólico de numeric_exp como un ángulo, expresado en radianes.

TAN(numeric_exp)

Devuelve la tangente de numeric_exp como un ángulo, expresado en radianes.

TANH(numeric_exp)

Devuelve la tangente hiperbólica de numeric_exp como un ángulo, expresado en radianes.

TRUNCATE(numeric_exp, integer_exp)

Devuelve un numeric_exp truncado a integer_exp lugares a la derecha del punto decimal sin redondear el valor.

TRUNCATE(0.5463111445,3)=0.546

Agregar

AVG(numeric_exp, integer_exp)

Devuelve el promedio calculado de los valores en numeric_exp.

outStatistics=[{"statisticType": "avg","onStatisticField": "pop1997","outStatisticFieldName": "avg_pop1997"}]

COUNT(string_exp OR ASTERISK)

Devuelve el número de filas que contienen string_exp.

outStatistics=[{"statisticType": "count","onStatisticField": "p_females","outStatisticFieldName": "count_p_females"}]

MAX(numeric_exp)

MAX(string_exp)

MAX(datetime_exp)

Devuelve el valor más grande en numeric_exp, string_exp o datetime_exp.

Encuentre el valor máximo en todas las filas numeric_exp:

outStatistics=[{"statisticType": "max","onStatisticField": "p_males","outStatisticFieldName": "max_p_males"}]

MIN(numeric_exp)

MIN(numeric_exp)

MIN(numeric_exp)

Devuelve el valor más pequeño en numeric_exp, string_exp o datetime_exp.

Encuentre el valor mínimo en todas las filas numeric_exp:

outStatistics=[{"statisticType": "min","onStatisticField": "pop1990","outStatisticFieldName": "min_pop1990"}]

STDDEV(numeric_exp)

Devuelve la desviación estándar de los valores en numeric_exp.

Busque la desviación estándar de todas las filas de numeric_exp:

outStatistics=[{"statisticType": "stddev","onStatisticField": "eval_score","outStatisticFieldName": "stddev_eval_score"}]

SUM(numeric_exp)

Devuelve la suma de los valores en numeric_exp.

Calcule la suma de los valores de todas las filas de numeric_exp:

outStatistics=[{"statisticType": "sum","onStatisticField": "p_females","outStatisticFieldName": "sum_p_females"}]

VAR(numeric_exp)

Devuelve la varianza de los valores en numeric_exp.

Encuentre el valor de varianza en todas las filas numeric_exp:

outStatistics=[{"statisticType": "var","onStatisticField": "pop1980","outStatisticFieldName": "var_pop1980"}]

Cadena de caracteres

CHAR_LENGTH(string_exp)

Devuelve la longitud en caracteres de la cadena de entrada.

Busque todas las filas en las que la longitud de string_exp sea superior a 10:

CHAR_LENGTH(string_exp) > 10

CONCAT(string_exp1, string_exp2)

Devuelve una cadena de caracteres que es el resultado de concatenar dos o más valores de cadena de caracteres.

Genere una versión concatenada de string_exp1 y string_exp2 con un carácter de concatenación:

OutFields=CONCAT(id,CONCAT(I-,name))

LOWER(string_exp)

Devuelve una cadena de caracteres igual a string_exp con todos los caracteres en mayúsculas convertidos a minúsculas. La configuración regional predeterminada es la configuración regional de la base de datos.

Busca todas las filas donde el valor sea la cadena de caracteres deseada, sin importar si se trata de mayúsculas o minúsculas:

LOWER(string_field) = "lowered_string"

POSITION(cahracter_exp1 IN character_exp2)

Devuelve la posición entera del primer character_exp1 en character_exp2.

Buscar todas las filas cuyo primer carácter sea "I":

POSITION('I' IN state_name) = 1

SUBSTRING(string_exp FROM start FOR length)

SUBSTRING(string_exp, integer_exp_start, integer_exp_length)

Devuelve una cadena de caracteres derivada de string_exp, que comienza en la posición de carácter especificada por start y tiene length caracteres.

Buscar todas las filas cuyos dos primeros caracteres de los valores de Stringfield sean Ch:

SUBSTRING(Stringfield FROM 1 FOR 2)='Ch'

TRIM(BOTH|LEADING|TRAILING trim_character FROM string_exp)

Devuelve string_exp con trim_character quitado del extremo inicial, del extremo final o de ambos extremos de la cadena.

Genere string_field sin el prefijo ni el sufijo no deseados:

OutFields=TRIM(BOTH '__' FROM string_exp)

UPPER(string_exp)

Devuelve una cadena de caracteres equivalente a string_exp, con todos los caracteres en minúsculas convertidos a mayúsculas. La configuración regional predeterminada es la configuración regional de la base de datos.

UPPER(name) = "TEXAS"

Otro

CAST(expression AS target_data_type)

Devuelve una expresión convertida a target_data_type.

Busca todas las filas en las que la expresión convertida a un tipo de datos específico sea igual al valor deseado:

CAST(parcel_id AS INT)=38456

COALESCE(expression1,expression2,...)

Devuelve el primer valor no nulo de una lista de expresiones.

Buscar todas las filas en las que el primer valor no nulo sea el valor especificado:

COALESCE(preferred_name, nickname, first_name) = 'MyName'

CURRENT_USER

Devuelve el usuario que ha iniciado sesión actualmente.

Nota:

Esto no devuelve el usuario actual de la base de datos.

Buscar todas las filas en las que el usuario actualmente conectado sea el único trabajador.

workerfield=CURRENT_USER

Busque todas las filas en las que el usuario actualmente conectado aparece como trabajador, independientemente de si hay otros trabajadores.

position(CURRENT_USER in workerfield) > 0

NULLIF(expression1,expression2)

Compara dos expresiones. Si son iguales, devuelve NULL. Si no son iguales, devuelve expression1.

Muestra el resultado de comparaciones NULLIF entre la expression1 y la expression2:

outFields=NULLIF(units_sold, unit_sell_goal)