Crear una función desencadenante en pgModeler

En cierto reino, en cierto estado ... necesitaba agregar un disparador al modelo en pgModeler . Qué hacer es bastante fácil. Pero para agregar una función de disparo ... También es fácil, pero tuve que lidiar un poco con los parámetros ofrecidos para el llenado / selección en la interfaz.

pgModeler es una muy buena herramienta de diseño de bases de datos que puede generar scripts sql para PostgreSQL . Los detalles sobre esta herramienta y sus capacidades se pueden encontrar en el sitio web oficial.

Como ejemplo, considere un modelo simplificado con una sola tabla.



Agregar una función al modelo.



Después de eso, se abrirá una ventana con varios parámetros editables con los que se creará la función. Sin embargo, algunos campos ya estarán llenos de valores predeterminados.



Consideremos estos parámetros con más detalle.

Creo que con los parámetros Nombre , Esquema , Propietario y Comentario todo está claro: este es el nombre de la función, el esquema de la base de datos, el propietario y el comentario para esta función, respectivamente.

Idioma es el nombre del idioma en el que se implementará la función. Para ser honesto, nunca he tenido que escribir funciones para PostgreSQL en otra cosa que no sea plpgsql . Por lo tanto, fue este valor para el parámetro que elegí.

Método de devolución Como en la función de activación no necesitamos devolver ni la tabla ni el conjunto de valores, dejamos Simple .

Con los parámetros en el bloque Tipo de datos , en general, todo también es simple. Porque Si se llama a la función en el activador, en el campo Tipo especificamos activador (el campo Formato se rellenará automáticamente con el valor del activador ). El campo Dimensión (el único campo digital no reservado en este bloque) es necesario para indicar la dimensión de la matriz del valor devuelto. Pero como solo necesitamos un valor, no una matriz, dejamos 0 en este campo.

Con los parámetros restantes, todo no es tan obvio, al menos para mí, porque Nunca tuve que pensar en ellos durante la creación habitual de funciones en PostgreSQL .

El tipo de función puede tomar uno de tres valores: INMUTABLE , ESTABLE y VOLATILE . A partir de la documentación oficial de PostgreSQL , puede descubrir que estos argumentos informan al optimizador de consultas sobre el comportamiento de la función.

  • INMUTABLE significa que la función no puede modificar la base de datos y siempre devuelve el mismo resultado para ciertos valores de los argumentos.
  • ESTABLE significa que la función no puede modificar la base de datos y, dentro de un escaneo de una sola tabla, siempre devuelve el mismo resultado para ciertos valores de los argumentos.
  • VOLÁTIL significa que el resultado de una función puede cambiar incluso dentro de un escaneo de una sola tabla, por lo que sus llamadas no se pueden optimizar.

En consecuencia, si la función de activación requiere cambiar la base de datos, entonces INMUTABLE no es adecuado. Una función con el parámetro ESTABLE no es adecuada para disparadores DESPUÉS que desean leer líneas modificadas por el comando actual. Queda VOLÁTIL , que no tiene los problemas anteriores. También se especificará de forma predeterminada si ninguno de los argumentos anteriores se especifica al crear la función.

La seguridad puede tomar uno de dos valores: DEFINICIÓN DE SEGURIDAD e INVOCADOR DE SEGURIDAD y es responsable de los derechos de qué usuario se llamará.

  • DEFINER DE SEGURIDAD significa que la función se ejecutará con los derechos del usuario que la posee, es decir, el que figuraba en Propietario .
  • INVOCADOR DE SEGURIDAD significa que la función se ejecutará con los derechos del usuario que la llamó.

De manera predeterminada, se utiliza INVOCADOR DE SEGURIDAD , por lo que puede dejarlo.

El comportamiento puede tomar uno de tres valores: ESTRICTO , DEVOLUCIONES NULL EN NULL INPUT y CALLED ON NULL INPUT y muestra cómo se comportará la función si hay valores NULL entre sus argumentos.

  • RETURNS NULL ON NULL INPUT o STRICT significa que la función siempre devolverá NULL si al menos uno de sus argumentos es NULL.
  • CALLED ON NULL INPUT significa que la función se llamará como de costumbre, incluso si NULL está entre sus argumentos.

El valor predeterminado es CALLED ON NULL INPUT . Por lo tanto, de la misma manera, puedes dejarlo.

Filas devueltas muestra el número de filas que el planificador esperará. El valor se especifica para funciones que devuelven conjuntos. Porque nuestra función devuelve un solo valor, dejamos 0 .

Costo de ejecución establece el costo para ejecutar esta función para el planificador. Para plpgsql , el valor predeterminado es 100 . Por lo tanto, indicamos este valor.

Windown Func. significa que se creará una función de ventana. En nuestro caso, porque necesitamos una función de activación, no necesitamos especificar este valor (bueno, en general, escriben en la documentación misma que tiene sentido especificar este parámetro solo para funciones escritas en C).

A prueba de fugas indica que la función está sellada, es decir que no divulga información sobre sus argumentos (por ejemplo, no muestra su significado en un mensaje de error), excepto para devolver un resultado. Porque Dado que la función de activación no acepta argumentos, no es necesario especificar este parámetro.

Entonces, los parámetros de la función han terminado. El cuerpo de la función en sí se puede escribir en la misma ventana en la pestaña Definición. Procedemos a crear el disparador mismo.



Después de eso, aparecerá la ventana de creación del disparador.



Considere los parámetros que se pueden establecer en esta ventana.

Con los parámetros Nombre , Alias y Comentario, nuevamente, todo está claro: este es el nombre del activador, el alias y el comentario al activador, respectivamente.

La ejecución muestra cómo se ejecutará este activador y puede tomar uno de los siguientes valores: ANTES , DESPUÉS e INSTEAD OF , lo que significa que la función se ejecutará antes, después o en lugar del evento.

POR CADA FILA determina si el procedimiento de disparo se disparará una vez por cada fila. Si no se especifica, se establecerá el parámetro FOR EACH STATEMENT , que determina que el procedimiento de activación se activa una vez para la instrucción SQL.

El evento determina qué eventos deben procesarse en este activador. Puede especificar múltiples eventos. Los eventos son de los siguientes tipos: INSERT , UPDATE , DELETE y TRUNCATE . Se producen cuando se llama al comando correspondiente con la misma instrucción SQL.

La restricción indica que se creará un activador de restricción. Los desencadenantes de restricciones se utilizan para generar excepciones cuando se violan las restricciones. Puede leer más sobre ellos en la documentación oficial.

Para un activador de restricción, puede especificar Diferible , que determina el tiempo de activación. Este parámetro puede tomar uno de los siguientes valores: INICIALMENTE INMEDIATO o INICIALMENTE DIFERIDO .

  • INICIALMENTE INMEDIATO significa que el disparador se disparará después de cada declaración.
  • INICIALMENTE DIFERIDO significa que el disparador se disparará solo al final de la transacción.

Consulte Tabla es el nombre de la tabla a la que hace referencia la restricción. Se usa para restricciones de clave externa y se permite solo para desencadenantes de restricción.

La condición es una condición que determina si se ejecutará la función de disparo. Para los disparadores FOR EACH ROW en este campo, puede acceder a los valores antiguos y nuevos a través de OLD y NEW, respectivamente (es decir, lo mismo que en el cuerpo de la función de disparo).

Argumentos : una lista de argumentos que se pasarán a la función de activación cuando se active la activación. Las constantes de cadena se pasan como argumentos a la función.

Columnas : solo se pueden especificar para eventos de ACTUALIZACIÓN . El activador solo funcionará si al menos una de las columnas especificadas está en la lista de columnas especificadas en ACTUALIZAR .

Conclusión


Eso, en general, es todo. Espero que esto haya sido interesante y sea útil para alguien.



Al escribir este artículo, se utilizó pgModeler versión 0.9.2-alpha, construida bajo Windows 7 x64. Cuando se usan versiones anteriores / nuevas de pgModeler, son posibles pequeñas diferencias en la interfaz.

El modelo utilizado en el artículo se puede descargar aquí .

Source: https://habr.com/ru/post/es424121/


All Articles