SQL Triggers: Implementación de Disparadores DDL y DML para Control de Datos
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 6,7 KB
Disparadores SQL: Control y Automatización de Operaciones en Bases de Datos
Los disparadores (triggers) en SQL son objetos de base de datos que se ejecutan automáticamente en respuesta a ciertos eventos. Se clasifican principalmente en DDL (Data Definition Language) y DML (Data Manipulation Language), permitiendo implementar reglas de negocio, auditorías y restricciones de integridad.
Disparadores DDL (CREATE, DROP, ALTER)
Los disparadores DDL se activan en respuesta a eventos relacionados con la definición de la estructura de la base de datos, como la creación, modificación o eliminación de objetos (tablas, bases de datos, vistas, etc.).
1. Disparador DDL a Nivel de Servidor: Impedir la Eliminación de Bases de Datos
Este ejemplo muestra cómo crear un disparador que se ejecuta en todo el servidor para evitar que cualquier base de datos sea eliminada.
CREATE TRIGGER NO_BORRARBASESDEDATOS -- Se almacena en los objetos del servidor
ON ALL SERVER -- Palabra reservada ON ALL SERVER (para todo el servidor)
FOR DROP_DATABASE -- Aquí se especifica la instrucción que ejecuta el disparador
AS
BEGIN
PRINT 'NO SE PUEDE BORRAR BASES DE DATOS'
ROLLBACK -- Para revertir la transacción
END
2. Disparadores DDL a Nivel de Base de Datos: Impedir la Eliminación de Tablas
A continuación, se presenta un disparador que opera a nivel de una base de datos específica (en este caso, BENDETTO
) para prevenir la eliminación de tablas.
CREATE TRIGGER NO_BORRARUNATABLA
ON DATABASE -- Esta condición cambia según el ámbito del disparador (servidor, tabla, base de datos)
FOR DROP_TABLE
AS
BEGIN
PRINT 'NO SE PUEDE BORRAR TABLAS DE BENDETTO'
ROLLBACK
END
Prueba del disparador:
Ahora, intentamos borrar cualquier tabla de BENDETTO
. El disparador debería impedir esta acción.
DROP TABLE EMPLEADOS
3. Gestión de Disparadores DDL
Desactivación de un Disparador a Nivel de Base de Datos
Para desactivar el disparador NO_BORRARUNATABLA
en la base de datos BENDETTO
:
DISABLE TRIGGER NO_BORRARUNATABLA ON DATABASE
Activación de un Disparador a Nivel de Base de Datos
Para volver a activar el disparador:
ENABLE TRIGGER NO_BORRARUNATABLA ON DATABASE
Desactivación de Todos los Disparadores a Nivel de Servidor
Para desactivar todos los disparadores definidos para todo el servidor:
DISABLE TRIGGER ALL ON ALL SERVER
Disparadores DML (INSERT, DELETE, UPDATE)
Los disparadores DML se activan en respuesta a eventos de manipulación de datos (inserción, actualización o eliminación de filas) en una tabla o vista.
1. Disparador para Impedir Añadir o Eliminar un Proveedor
Este disparador se crea en la tabla S
(proveedores) y evita las operaciones de inserción y eliminación.
CREATE TRIGGER AÑADIR_ELIMINAR_PROVEEDOR
ON S -- Se almacena en la tabla S dentro de los desencadenadores
AFTER INSERT, DELETE
AS
BEGIN
PRINT 'ERROR: Operación no permitida en la tabla de proveedores.'
ROLLBACK
END
Prueba del disparador:
INSERT INTO S VALUES ('SSS','PEPE',9,'GRANADA')
2. Disparador para Restringir la Modificación del ID del Proveedor
Este disparador se activa cuando se intenta actualizar la columna IDS
en la tabla S
.
CREATE TRIGGER MODIFICAR_IDS
ON S
AFTER UPDATE
AS
BEGIN
IF UPDATE(IDS) -- Solo para la columna IDS
BEGIN
PRINT 'NO ESTÁ PERMITIDO MODIFICAR EL ID DEL PROVEEDOR.'
ROLLBACK
END
END
Prueba del disparador:
UPDATE S SET IDS='S44' WHERE IDS='S1' -- Resultado: "NO ESTÁ PERMITIDO MODIFICAR EL ID DEL PROVEEDOR."
3. Disparador para Impedir la Eliminación Masiva de Filas
Este disparador en la tabla S
previene la eliminación de más de una fila (tupla) a la vez.
CREATE TRIGGER NO_BORRARTUPLA
ON S
AFTER DELETE
AS
BEGIN
IF (SELECT COUNT(*) FROM DELETED) > 1 -- Cuenta el número de filas en la tabla DELETED
BEGIN
PRINT 'NO SE PUEDEN BORRAR VARIAS FILAS DE GOLPE.'
ROLLBACK
END
END
Prueba del disparador:
Primero, realizamos una inserción masiva para tener datos de prueba:
SELECT TOP 5 PEDIDO, PRODUCTO, PRECIOUNIDAD, CANTIDAD
INTO TABLA_TEMPORAL
FROM DETALLESPEDIDOS;
Luego, intentamos una eliminación masiva:
DELETE S WHERE CIUDAD='MADRID'
4. Disparador para Control de Existencias en Ventas
En la base de datos BENDETTO
, este disparador en la tabla DETALLESPEDIDOS
asegura que no se puedan vender productos de los que no se tienen existencias suficientes.
CREATE TRIGGER NO_EXISTENCIAS
ON DETALLESPEDIDOS
AFTER INSERT
AS
BEGIN
-- Si la cantidad en la tabla transitoria INSERTED es mayor que las existencias de ese producto en la tabla PRODUCTOS
IF (SELECT CANTIDAD FROM INSERTED) > (SELECT EXISTENCIAS FROM PRODUCTOS
WHERE IDPRODUCTO = (SELECT PRODUCTO FROM INSERTED))
BEGIN
PRINT 'NO SE PUEDE INSERTAR UNA CANTIDAD DE PRODUCTO QUE NO ESTÉ EN EXISTENCIAS.'
ROLLBACK
END
END
Prueba del disparador (con existencias suficientes):
INSERT INTO DETALLESPEDIDOS (PEDIDO, PRODUCTO, PRECIOUNIDAD, CANTIDAD, DESCUENTO) VALUES (9000,1,1,20,20)
Prueba del disparador (sin existencias suficientes):
INSERT INTO DETALLESPEDIDOS (PEDIDO, PRODUCTO, PRECIOUNIDAD, CANTIDAD, DESCUENTO) VALUES (9000,1,1,40,1)
5. Disparador para una Vista: Aviso de Stock Mínimo (Incompleto)
Este disparador, diseñado para la tabla PRODUCTOS
, tiene como objetivo avisar cuando las existencias de un producto caen por debajo de su stock mínimo al ser actualizadas. El ejercicio original está incompleto.
CREATE TRIGGER PEDIDOSAPROVEEDORES
ON PRODUCTOS
AFTER UPDATE
AS
BEGIN
-- Si las existencias son menores que el stock mínimo
IF UPDATE (EXISTENCIAS)
IF (SELECT EXISTENCIAS FROM INSERTED) < (SELECT STOCKMINIMO FROM PRODUCTOS -- Ejercicio incompleto
-- WHERE IDPRODUCTO = (SELECT IDPRODUCTO FROM INSERTED) -- Posible condición para completar
)
BEGIN
-- Lógica para enviar aviso o realizar alguna acción
-- PRINT 'AVISO: Stock mínimo alcanzado para el producto.'
END
END