143 - Disparador de borrado (delete trigger) |
Podemos crear un disparador para que se ejecute siempre que una instrucción "delete" elimine datos en una tabla.
Sintaxis básica:
create triggre NOMBREDISPARADOR on NOMBRETABLA for delete as SENTENCIAS
Analizamos la sintaxis:
"create trigger" junto al nombre del disparador; "on" seguido del nombre de la tabla para la cual se establece el trigger.
Luego de "for" se coloca el evento (en este caso "delete"), lo que indica que las eliminaciones sobre la tabla activarán el trigger.
Luego de "as" se especifican las condiciones que determinan cuando un intento de eliminación causa las acciones que el trigger realizará.
El disparador del siguiente ejemplo se crea para la tabla "ventas", para que cada vez que se elimine un registro de "ventas", se actualice el campo "stock" de la tabla "libros" (por ejemplo, si el comprador devuelve los libros comprados):
create trigger DIS_ventas_borrar on ventas for delete as update libros set stock= libros.stock+deleted.cantidad from libros join deleted on deleted.codigolibro=libros.codigo;
Entonces, creamos el disparador ("create trigger") dándole un nombre ("DI_ventas_borrar") sobre ("on") una tabla específica ("ventas") para ("for") el evento de borrado ("delete"). Luego de "as" colocamos las sentencias, las acciones que el trigger realizará cuando se elimine un registro en "ventas" (en este caso, aumentar el stock de "libros").
Cuando se activa un disparador "delete", los registros eliminados en la tabla del disparador se agregan a una tabla llamada "deleted". La tabla "deleted" es una tabla virtual que conserva una copia de los registros eliminados; tiene una estructura similar a la tabla en que se define el disparador, es decir, la tabla en que se intenta la acción.
Dentro del trigger se puede acceder a esta tabla virtual "deleted".
El siguiente disparador se crea para controlar que no se elimine más de un registro de la tabla "libros". El disparador se activa cada vez que se elimina un registro o varios, controlando la cantidad de registros que se están eliminando; si se está eliminando más de un registro, el disparador retorna un mensaje de error y deshace la transacción:
create trigger DIS_libros_borrar on libros for delete as if (select count(*) from deleted) > 1 begin raiserror('No puede borrar más de un libro',16,1) rollback transaction end;
Si se ejecuta un "delete" sobre "libros" que afecte a varios registros, se activa el disparador y evita la transacción.
Si se ejecuta el siguiente "delete", que afecta a un solo registro, se activa el disparador y permite la transacción:
delete from libros where codigo=5;
La sentencia "truncate table" no puede incluirse en un disparador de borrado (delete trigger).