Maybaygiare.org

Blog Network

PostgreSQL – TRIGGERS

Advertisements

PostgreSQL Triggers are database callback functions, which are automatically performed/invoked when a specified database event occurs.

Los siguientes son puntos importantes sobre los disparadores de PostgreSQL:

  • El disparador de PostgreSQL se puede especificar para disparar

    • Antes de que se intente la operación en una fila (antes de que se comprueben las restricciones y se intente INSERTAR, ACTUALIZAR o ELIMINAR)

    • En lugar de la operación (en el caso de inserciones, actualizaciones o eliminaciones en una vista)

  • Se llama una vez a un disparador marcado PARA CADA FILA por cada fila que la operación se modifica. Por el contrario, un disparador marcado PARA CADA INSTRUCCIÓN solo se ejecuta una vez para cualquier operación, independientemente de cuántas filas modifique.

  • Tanto la cláusula WHEN como las acciones trigger pueden acceder a elementos de la fila que se inserta, elimina o actualiza utilizando referencias del formulario NEW.nombre de columna y ANTIGUO.nombre de columna, donde nombre de columna es el nombre de una columna de la tabla a la que está asociado el desencadenador.

  • Si se suministra una cláusula WHEN, las sentencias PostgreSQL especificadas solo se ejecutan para filas para las que la cláusula WHEN es verdadera. Si no se proporciona ninguna cláusula WHEN, las sentencias PostgreSQL se ejecutan para todas las filas.

  • Si se definen varios disparadores del mismo tipo para el mismo evento, se dispararán en orden alfabético por nombre.

  • La palabra clave ANTES, DESPUÉS o EN LUGAR DE determina cuándo se ejecutarán las acciones del desencadenador en relación con la inserción, modificación o eliminación de la fila asociada.

  • Los desencadenadores se eliminan automáticamente cuando se elimina la tabla a la que están asociados.

  • La tabla que se va a modificar debe existir en la misma base de datos que la tabla o vista a la que se adjunta el desencadenador y se debe usar solo nombre de tabla, no base de datos.nombre de tabla.

  • Una opción de RESTRICCIÓN cuando se especifica crea un desencadenador de restricción. Esto es lo mismo que un gatillo normal, excepto que el tiempo de disparo del gatillo se puede ajustar utilizando RESTRICCIONES ESTABLECIDAS. Se espera que los desencadenadores de restricciones generen una excepción cuando se violen las restricciones que implementan.

la Sintaxis de

La sintaxis básica de la creación de un trigger es la siguiente −

CREATE TRIGGER trigger_name event_nameON table_name;

Aquí, event_name podría ser INSERT, DELETE, UPDATE, y TRUNCADA en la base de datos de la operación en la mencionada tabla nombre_tabla. Opcionalmente, puede especificar PARA CADA FILA después del nombre de la tabla.

La siguiente es la sintaxis para crear un desencadenador en una operación de ACTUALIZACIÓN en una o más columnas especificadas de una tabla de la siguiente manera:

CREATE TRIGGER trigger_name UPDATE OF column_nameON table_name;

Ejemplo

Consideremos un caso en el que queremos mantener una prueba de auditoría para cada registro que se inserta en la tabla de EMPRESA, que crearemos nuevamente de la siguiente manera (Elimine la tabla de EMPRESA si ya la tiene).

testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);

Para mantener la prueba de auditoría, crearemos una nueva tabla llamada AUDITORÍA donde se insertarán mensajes de registro cada vez que haya una entrada en la tabla de la EMPRESA para un nuevo registro −

testdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL);

Aquí, ID es el ID del registro de AUDITORÍA, y EMP_ID es el ID, que vendrá de la tabla de la EMPRESA, y la FECHA mantendrá la marca de tiempo cuando el registro se creará en la tabla de EMPRESA. Así que ahora, vamos a crear un disparador en la tabla de la EMPRESA de la siguiente manera −

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANYFOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

Donde auditlogfunc() es un procedimiento PostgreSQL y tiene la siguiente definición –

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END;$example_table$ LANGUAGE plpgsql;

Ahora, comenzaremos el trabajo real. Comencemos a insertar el registro en la tabla de la EMPRESA, lo que debería dar lugar a la creación de un registro de registro de auditoría en la tabla de AUDITORÍA. Así que vamos a crear un registro en la tabla de EMPRESA de la siguiente manera:

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );

Esto creará un registro en la tabla de EMPRESA, que es el siguiente:

 id | name | age | address | salary----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000

Al mismo tiempo, se creará un registro en la tabla de AUDITORÍA. Este registro es el resultado de un disparador, que hemos creado en la operación de INSERCIÓN en la tabla de la EMPRESA. Del mismo modo, puede crear sus disparadores en operaciones de ACTUALIZACIÓN y ELIMINACIÓN en función de sus requisitos.

 emp_id | entry_date--------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30(1 row)

Listar DISPARADORES

Puede enumerar todos los disparadores de la base de datos actual desde la tabla pg_trigger de la siguiente manera:

testdb=# SELECT * FROM pg_trigger;

La instrucción PostgreSQL dada anteriormente enumerará todos los disparadores.

Si desea enumerar los disparadores en una tabla en particular, use la cláusula AND con el nombre de la tabla de la siguiente manera −

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

La instrucción PostgreSQL dada anteriormente también enumerará solo una entrada de la siguiente manera −

 tgname----------------- example_trigger(1 row)

DISPARADORES de caída

El siguiente es el comando DE CAÍDA, que se usa para soltar un disparador existente −

testdb=# DROP TRIGGER trigger_name;
Anuncios

Deja una respuesta

Tu dirección de correo electrónico no será publicada.