PL/Perl se puede utilizar para escribir funciones de disparador (trigger). En una función de disparador,
la referencia a hash $_TD contiene información sobre el
evento de disparo actual. $_TD es una variable global,
la cual obtiene un valor local separado para cada invocación del disparador.
Los campos de la referencia a hash $_TD son:
$_TD->{new}{foo}
El valor NEW de la columna foo
$_TD->{old}{foo}
El valor OLD de la columna foo
$_TD->{name}Nombre del disparador que está siendo llamado
$_TD->{event}
Evento de disparo: INSERT, UPDATE,
DELETE, TRUNCATE, o UNKNOWN
$_TD->{when}
Cuándo se llamó al disparador: BEFORE,
AFTER, INSTEAD OF, o
UNKNOWN
$_TD->{level}
El nivel de disparo: ROW, STATEMENT, o UNKNOWN
$_TD->{relid}OID de la tabla en la que se disparó el disparador
$_TD->{table_name}Nombre de la tabla en la que se disparó el disparador
$_TD->{relname}Nombre de la tabla en la que se disparó el disparador. Esto ha sido desaprobado (deprecated), y podría eliminarse en una versión futura. Por favor, utiliza $_TD->{table_name} en su lugar.
$_TD->{table_schema}Nombre del esquema en el que se encuentra la tabla en la que se disparó el disparador
$_TD->{argc}Número de argumentos de la función de disparador
@{$_TD->{args}}
Argumentos de la función de disparador. No existe si $_TD->{argc} es 0.
Los disparadores a nivel de fila pueden devolver uno de los siguientes:
return;Ejecuta la operación
"SKIP"No ejecutes la operación
"MODIFY"
Indica que la fila NEW fue modificada por
la función de disparador
Aquí hay un ejemplo de una función de disparador, que ilustra algo de lo anterior:
CREATE TABLE test (
i int,
v varchar
);
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
return "SKIP"; # salta el comando INSERT/UPDATE
} elsif ($_TD->{new}{v} ne "immortal") {
$_TD->{new}{v} .= "(modified by trigger)";
return "MODIFY"; # modifica la fila y ejecuta el comando INSERT/UPDATE
} else {
return; # ejecuta el comando INSERT/UPDATE
}
$$ LANGUAGE plperl;
CREATE TRIGGER test_valid_id_trig
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW EXECUTE FUNCTION valid_id();