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

Entradas relacionadas: