Actualizado el 21 de Marzo del 2018 (Publicado el 1 de Octubre del 2017)
572 visualizaciones desde el 1 de Octubre del 2017
68,5 KB
11 paginas
Creado hace 20a (13/11/2004)
Disparadores
Álvaro Herrera
13 de noviembre de 2004
Álvaro Herrera
Disparadores
Contenidos
I Qué es un disparador
I Componentes
I La función de disparador
I Ejemplo PL/pgSQL
I Ejemplo PL/Tcl
Álvaro Herrera
Disparadores
Qué es un disparador?
I “Trigger”
I Qué hace: ejecutar una acción
I Cuándo: un evento ocurre en la base de datos
I Acciones:
I una función de disparador
I Eventos:
I INSERT
I UPDATE
I DELETE
Álvaro Herrera
Disparadores
Componentes
CREATE TRIGGER [ nombre ]
{ BEFORE | AFTER }
{ evento [ OR ... ] }
[ FOR EACH { ROW | STATEMENT } ]
EXECUTE PROCEDURE funcion(argumentos)
Álvaro Herrera
Disparadores
La función de disparador
CREATE FUNCTION nombre ( args )
RETURNS TRIGGER [ ... ]
Elementos del disparador se pasan de forma especial
I elementos del registro
I FOR EACH ROW
I NEW / OLD
I nombre de la tabla, evento, etc
I argumentos de creación
Álvaro Herrera
Disparadores
NEW, OLD
I Registros que la función recibe
I NEW
I registro insertado (INSERT)
I registro modificado (UPDATE)
I OLD
I registro antes de modificar (UPDATE)
I registro eliminado (DELETE)
I OLD
I Pueden ser modificados
I Puede retornar:
I NULL (detener la accion)
I OLD (evento DELETE)
I NEW (eventos INSERT, UPDATE)
Modificaciones sólo con disparadores BEFORE!
Álvaro Herrera
Disparadores
Ejemplo PL/pgSQL
CREATE FUNCTION verifica_empleado() RETURNS trigger
LANGUAGE plpgsql AS ’
BEGIN
IF NEW.sueldo < OLD.sueldo THEN
RAISE NOTICE ’’no bajaremos el sueldo’’;
RETURN NULL;
END IF;
IF NEW.sueldo < 0 THEN
RAISE EXCEPTION ’’% debe tener sueldo positivo’, NEW.nombre;
END IF;
NEW.ultima_fecha := ’now’;
NEW.ultimo_usuario := current_user;
RETURN NEW;
END;
’;
Álvaro Herrera
Disparadores
Ejemplo PL/pgSQL
CREATE FUNCTION actualiza_inventario() RETURNS trigger
LANGUAGE plpgsql AS ’
BEGIN
END
’;
Álvaro Herrera
Disparadores
Ejemplo PL/Tcl
CREATE OR REPLACE FUNCTION minusculas()
RETURNS trigger AS ’
foreach key $args {
if {[info exists NEW($key)]} {
set NEW($key) [string tolower $NEW($key)]
}
}
return [array get NEW]
’ LANGUAGE pltcl;
CREATE TRIGGER minusculizar
BEFORE INSERT OR UPDATE ON una_tabla
FOR EACH ROW EXECUTE PROCEDURE
minusculas(’campo_1’, ’campo_2’);
Álvaro Herrera
Disparadores
Ejemplo PL/Tcl
CREATE TABLE usuarios
(usuario_id int,
nombre text);
CREATE TABLE usuarios_audit
(usuario_id int,
nombre text,
op text,
fecha timestamp with time zone);
Álvaro Herrera
Disparadores
Ejemplo PL/Tcl
CREATE OR REPLACE FUNCTION
audita_usuarios() RETURNS trigger AS ’
spi_exec "INSERT INTO usuarios_audit
VALUES ($NEW(usuario_id),
’’[ quote $NEW(nombre) ]’’,
’’[ quote $TG_op ]’’,
now())"
return [array get NEW]
’ LANGUAGE pltcl;
CREATE TRIGGER audita
BEFORE UPDATE OR INSERT OR DELETE
ON usuarios FOR EACH ROW
EXECUTE PROCEDURE audita_usuarios();
Álvaro Herrera
Disparadores
Comentarios de: Disparadores (0)
No hay comentarios