Data Management (DMS) ofrece un lenguaje específico de dominio (DSL) para definir reglas de seguridad en los flujos de trabajo de desarrollo de bases de datos. Utilice las reglas DSL para controlar qué sentencias SQL se pueden enviar, cómo se enrutan las aprobaciones y cuándo se bloquean o marcan operaciones como riesgosas.
Funcionamiento
Una regla de seguridad es una sentencia IF-THEN o IF-THEN-ELSE. Cuando se cumple una condición, DMS ejecuta la acción correspondiente.
Estructura básica:
if <condition>
then <action>
end
Estructura extendida con varias ramas:
if <condition 1>
then <action 1>
elseif <condition 2>
then <action 2>
[else <action 3>]
end
Cada regla debe contener exactamente una condición if. Puede tener cero o más ramas elseif y cero o una cláusula else. Si ninguna rama coincide y no existe una cláusula else, DMS no realiza ninguna acción.
Componentes del DSL
Una regla de seguridad consta de tres bloques fundamentales: cláusulas condicionales, cláusulas de acción y funciones predefinidas.
Cláusulas condicionales
Una cláusula condicional se evalúa como true o false. Se construye a partir de uno o varios de los siguientes elementos:
Factores: variables predefinidas del sistema que representan el contexto en el momento de la evaluación (por ejemplo, tipo de sentencia SQL, número de filas afectadas).
Operadores: símbolos que comparan o prueban valores.
Conectores:
ANDyOR, que combinan múltiples expresiones.
AND tiene mayor prioridad que OR. Ambos tienen menor prioridad que los operadores. Use paréntesis para modificar el orden de evaluación predeterminado.
Ejemplo: En 1 <= 0 or 1 == 1, DMS evalúa 1 <= 0 y 1 == 1 por separado, y luego aplica OR. Para hacer explícita la prioridad: (1 <= 0) == true.
Operadores
Los operadores conectan factores y constantes en las expresiones condicionales. Se admiten los siguientes operadores:
|
Operador |
Descripción |
Ejemplo |
|
|
Igual a |
|
|
|
Distinto de |
|
|
|
Mayor que |
|
|
|
Mayor o igual que |
|
|
|
Menor que |
|
|
|
Menor o igual que |
|
|
|
Pertenece a un arreglo |
|
|
|
No pertenece a un arreglo |
|
|
|
Coincide con una expresión regular |
|
|
|
No coincide con una expresión regular |
|
|
|
El valor está vacío |
|
|
|
El valor no está vacío |
|
Escape de barra invertida en expresiones regulares: Para incluir una barra invertida literal (\) en un patrón regex, escápela con otra barra invertida. Por ejemplo, escriba idx_\\w+ para que coincida con idx_\w+.
Factores
Los factores son variables predefinidas que proporcionan contexto durante la evaluación de la regla de seguridad, como el tipo de sentencia SQL, el número de filas afectadas o si el destino es una base de datos lógica. Úselos en cláusulas condicionales para escribir reglas basadas en metadatos reales de la operación.
El nombre de un factor utiliza el formato @fac.<display-name>. DMS proporciona diferentes factores para distintos puntos de control en cada módulo.
|
Factor |
Descripción |
|
|
Tipo de entorno. Valores de ejemplo: |
|
|
Tipo de sentencia SQL. Valores de ejemplo: |
|
|
Tipo de ticket de cambio de datos. Consulte los valores válidos a continuación. |
|
|
Indica si la base de datos destino es una base de datos lógica. |
|
|
Otra información del ticket. No se utiliza actualmente. |
|
|
Indica si se omite la validación del recuento de filas. |
|
|
Número de filas por insertar. |
|
|
Número de filas por actualizar o eliminar. |
|
|
Tamaño del espacio de tablas más grande que contiene la tabla por modificar. |
|
|
Indica si la sentencia SQL involucra campos sensibles. |
|
|
Campos sensibles involucrados en la sentencia SQL. |
|
|
Nivel de riesgo de la operación. |
|
|
Motivo del nivel de riesgo asignado. |
|
|
Lista de nombres de bases de datos seleccionados en el ticket. |
Valores válidos para @fac.detail_type:
|
Valor |
Tipo de ticket |
|
|
Normal Data Modify |
|
|
Lockless Change |
|
|
Programmable Object |
|
|
History Data Clean |
|
|
Large Data Import |
Ejemplo: Comprobar si una sentencia SQL es de tipo DML:
@fac.sql_type == 'DML'
Cláusulas de acción
Una acción define lo que hace DMS cuando se cumple una condición. Los nombres de las acciones utilizan el formato @act.<display-name>. DMS proporciona diferentes acciones para distintos puntos de control en cada módulo.
| Acción | Descripción |
|---|---|
@act.allow_submit |
Requiere que el envío de sentencias SQL se ejecute dentro de un ticket. |
@act.allow_execute_direct |
Permite la ejecución de sentencias SQL en SQL Console. |
@act.forbid_execute |
Bloquea la ejecución de sentencias SQL. |
@act.mark_risk |
Marca la operación con un nivel de riesgo y un mensaje personalizado. Ejemplo: @act.mark_risk 'middle' 'Medium risk: online environment' |
@act.do_not_approve |
Especifica el ID de una plantilla de aprobación. Consulte Configurar procesos de aprobación. |
@act.choose_approve_template |
|
@act.choose_approve_template_with_reason |
Funciones predefinidas
Las funciones predefinidas se pueden usar tanto en cláusulas condicionales como en cláusulas de acción. Los nombres de las funciones utilizan el formato @fun.<display-name>.
|
Función |
Entrada |
Salida |
Descripción |
|
|
Varias cadenas |
Cadena |
Concatena cadenas en una sola. |
|
|
Una cadena |
Entero |
Devuelve la longitud de una cadena. |
|
|
Una cadena |
Booleano |
Devuelve |
|
|
Una cadena |
Booleano |
Devuelve |
|
|
Un arreglo |
Entero |
Devuelve el número de elementos en un arreglo. |
|
|
Varios valores numéricos |
Numérico |
Suma varios valores. |
|
|
Dos valores numéricos |
Numérico |
Resta el segundo valor del primero. |
|
|
Tres valores: objetivo, límite inferior, límite superior |
Booleano |
Devuelve |
|
|
Ninguna |
Cadena |
Devuelve la fecha y hora actuales en formato |
|
|
Ninguna |
Cadena |
Devuelve la fecha actual en formato |
|
|
Ninguna |
Cadena |
Devuelve la hora actual en formato |
|
|
Dos cadenas |
Booleano |
Devuelve |
|
|
Dos listas de cadenas |
Booleano |
Devuelve |
Ejemplos seleccionados:
Concatenación de cadenas:
@fun.concat('d', 'm', 's')
// Output: 'dms'
@fun.concat('[Development standards] Enter a comment for the [', @fac.column_name, '] field.')
// Output: a reminder message with the field name inserted
Comprobación de si un valor numérico cae dentro de un rango:
@fun.between(@fac.export_rows, 2001, 100000)
// Returns true if the number of exported rows is between 2,001 and 100,000
@fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00')
// Returns true if the current date and time fall within the specified window
Comprobación de igualdad de listas:
@fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY'])
// Returns true if only the query permission is requested
@fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT', 'EXPORT'])
// Returns true if both the change and export permissions are requested
Ejemplos
Limitar el número de sentencias SQL por ticket
Bloquee el envío si un ticket contiene más de 1,000 sentencias SQL:
if
@fac.sql_count > 1000
then
@act.reject_execute 'The number of SQL statements in a ticket cannot exceed 1,000.'
end
Si el recuento supera 1,000, DMS rechaza el ticket y muestra el mensaje.
Permitir solo sentencias DML
Permita el envío únicamente cuando todas las sentencias SQL sean operaciones DML:
if
@fac.sql_type in ['UPDATE', 'DELETE', 'INSERT', 'INSERT_SELECT']
then
@act.allow_submit
end