Activadores SQL: la guía esencial

Los disparadores son entidades de base de datos en SQL Server. Técnicamente, son una clase particular de llamadas a funciones que responde a operaciones específicas de la base de datos.

Esta guía esencial le brindará información detallada sobre SQL Triggers que puede ser muy útil en su profesión. ¡Empecemos!

¿Qué son los disparadores SQL?

La palabra «disparador» describe una declaración de que un servidor ejecuta automáticamente la consulta cada vez que se modifica el contenido de la base de datos.

Un activador es un grupo de consultas SQL con nombres especiales que se almacenan en el espacio de la memoria. Es un tipo específico de llamada de función que se invoca inmediatamente cada vez que se produce un evento de base de datos. Cada disparador tiene una tabla asignada.

Por ejemplo, se podría activar un disparador cada vez que se agrega una nueva columna a una tabla en particular o si se modifican registros específicos.

Según Microsoft Developer Network, los disparadores son una clase particular de procedimientos almacenados. En una declaración de desencadenador, inicialmente definimos cuándo se debe ejecutar el desencadenante y luego proporcionamos la acción que se debe realizar después de que se haya activado el desencadenante.

Sintaxis:

CREATE TRIGGER trigger_name
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON tableName
FOR EACH ROW SET operation [trigger_body];

Explicación de cada parámetro

  • CREATE TRIGGER trigger_name: se utiliza para construir un disparador o para cambiar el nombre de un disparador existente.
  • ANTES/DESPUÉS: esta consulta se utiliza para definir el tiempo de ejecución del activador (antes o después de un determinado evento).
  • INSERTAR/ACTUALIZAR/ELIMINAR: describe la acción que deseamos realizar en las tablas.
  • ON tableName: aquí definimos el nombre de la tabla para configurar un disparador.
  • PARA CADA FILA: esta declaración se relaciona con el activador de fila, lo que significa que los activadores se ejecutarán cada vez que se modifique una fila.
  • trigger_body: especifica la acción a realizar cuando se activa el disparador.

Los activadores son funciones almacenadas con identidades distintivas que nos permiten reutilizar consultas que ya se han ejecutado y almacenado de forma segura en la memoria. Ahora tratemos de entender por qué SQL los necesita.

Los disparadores se utilizan principalmente para regular la implementación de código cada vez que se produce un evento. Para decirlo de otra manera, el uso de disparadores es la opción ideal si necesita que un fragmento de código específico se ejecute constantemente en respuesta a un evento específico.

Los siguientes son algunos de los beneficios de utilizar disparadores en las operaciones de la base de datos SQL.

  • Realiza comprobaciones adicionales al insertar, actualizar o eliminar datos de la tabla afectada.
  • Reduce los tiempos de respuesta, lo que ayuda a aumentar los gastos informáticos.
  • Habilita la codificación de parámetros predeterminados sofisticados que son inaccesibles por restricciones iniciales.
  • La integridad referencial es una propiedad central clave de los sistemas de bases de datos relacionales. Esto significa que los datos guardados en el sistema de base de datos deben ser siempre precisos para cada transacción y cada operación.

    Si dos tablas están ubicadas en bases de datos o sistemas separados, no hay forma de garantizar la validación de datos dentro de ellas mediante valores de restricción. En tal situación, los disparadores son la única opción para la ejecución.

    Combinación de argumentos desencadenantes

    Para cada tabla, podemos especificar seis tipos de disparadores diferentes. Estos son la combinación de los argumentos de Trigger incluidos en los Triggers de nivel de fila de SQL.

    ANTES DE INSERTAR: estos disparadores ejecutan la acción en las filas antes de realizar cualquier operación INSERTAR en la tabla especificada o en la base de datos.

    DESPUÉS DE INSERTAR: Ejecuta la acción en las filas inmediatamente después de cualquier actividad de INSERCIÓN de la base de datos.

    ANTES DE LA ACTUALIZACIÓN: con estos activadores, se realiza una función en las filas antes de que se realice una acción de ACTUALIZAR en la base de datos.

    DESPUÉS DE LA ACTUALIZACIÓN: ejecuta la acción en las filas inmediatamente después de cualquier actividad de ACTUALIZACIÓN de la base de datos o tabla específica.

    ANTES DE ELIMINAR: Ejecuta una determinada operación en las filas incluso antes de que la base de datos o tabla se someta a una acción de ELIMINAR.

    DESPUÉS DE ELIMINAR: estos activadores ejecutan la acción en las filas que siguen a cada transacción DELETE.

    Tipos de disparadores SQL

    Los disparadores de SQL son funciones almacenadas que se ejecutan inmediatamente cuando ocurren eventos específicos. Se parece a la programación basada en eventos. Las situaciones posteriores pueden iniciar la ejecución de disparadores.

    Disparadores DML: DML significa Lenguaje de manipulación de datos. La ejecución de código en reacción a la modificación de datos se hace posible mediante DML Triggers. Este disparador se activa cuando se ejecutan comandos DML como INSERTAR, ACTUALIZAR y ELIMINAR. Estos también se denominan «disparadores de nivel de tabla».

    Disparadores DDL: DDL significa Lenguaje de definición de datos. Los disparadores DDL nos permiten ejecutar código en reacción a los cambios en el esquema de la base de datos, como agregar o eliminar tablas, o eventos del servidor, como cuando un usuario se registra. Estos se denominan «Desencadenadores de nivel de base de datos».

    Estos disparadores se pueden activar cuando se ejecutan ciertas declaraciones DDL como CREAR, ALTERAR o DROP en la base de datos activa. Estos también se pueden utilizar para controlar y administrar las actividades que se ejecutan.

    Activadores de inicio de sesión: cada vez que se produce un evento de inicio de sesión (inicio, inicio de sesión, cierre de sesión, apagado), los activadores de inicio de sesión se invocan inmediatamente. Sólo se realizan tras un proceso de autenticación del usuario incluso antes de que se inicie la transacción del usuario. Los disparadores de INICIO DE SESIÓN no se activarán si falla la autorización.

    Estos disparadores se pueden usar para registrar el historial de inicio de sesión o establecer una restricción de eventos para un inicio de sesión en particular, entre otras funciones de auditoría y gestión de identidad para las conexiones del servidor.

    Desencadenadores de CLR: CLR significa Common Language Runtime. Los disparadores CLR son, de hecho, un subconjunto único de disparadores creados principalmente en CLR dentro de la tecnología .NET. Estos disparadores son útiles si el disparador necesita realizar muchos cálculos o necesita relacionarse con una entidad que no sea SQL.

    De hecho, los activadores DML y DDL se pueden construir habilitando la codificación de activadores CLR admitidos en tecnologías .NET, incluidas Visual Basic, C# y F-sharp.

    Desencadenador de ejemplo de SQL Server

    Comprendamos estos conceptos desencadenantes con un ejemplo.

    Primero, creemos una base de datos usando sentencias SQL.

    CREATE DATABASE testdb;
    use testdb;

    Aquí, he dado un «testdb» como nombre de la base de datos. Y el siguiente paso es crear una tabla.

    CREATE TABLE student(
      name varchar(25),
      id int(2),
      maths int(2),
      physics int(2),
      biology int(2),
      social int(2),
      total int(2)
     );

    He creado una tabla para almacenar los detalles de los estudiantes. Y aquí está el comando para describir la estructura de la tabla. Aquí «estudiante» es el nombre de la tabla que he dado.

    DESC student;

    A continuación se muestra la estructura de la tabla que he creado.

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | name    | varchar(25) | YES  |     | NULL    |       |
    | id      | int         | YES  |     | NULL    |       |
    | maths   | int         | YES  |     | NULL    |       |
    | physics | int         | YES  |     | NULL    |       |
    | biology | int         | YES  |     | NULL    |       |
    | social  | int         | YES  |     | NULL    |       |
    | total   | int         | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)

    Después de crear una tabla, el siguiente paso es configurar un disparador. Intentemos usar el argumento ANTES DE INSERTAR.

    El nombre del disparador que he creado es «marcas». Tan pronto como se modifica la tabla con las calificaciones del estudiante, el disparador a continuación intenta determinar automáticamente la calificación general del estudiante.

    CREATE TRIGGER marks
    BEFORE INSERT
    ON
    student
    FOR EACH ROW
    set new.total=new.maths+new.physics+new.biology+new.social;

    Dado que debemos reemplazar los datos de las filas en lugar de trabajar con los antiguos, hemos definido «total» con un nuevo nombre de clase, y todas las expresiones posteriores tienen el prefijo de nuevas palabras clave después del total mediante el operador de punto. Ahora, agregaremos valores a cada fila y veremos los resultados. Inicialmente, la nota total es 0 para cada alumno.

    INSERT INTO student VALUES("George",02,99,87,92,91,0);
    INSERT INTO student VALUES("James",03,91,81,94,90,0);
    INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
    INSERT INTO student VALUES("John",05,73,89,78,92,0);
    INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);
    

    La declaración de activación se activará automáticamente cuando se inserten datos en la tabla de estudiantes en este caso. El disparador calculará las calificaciones totales de cada alumno. Ahora, veamos si el activador se invoca o no mediante una instrucción SELECT.

    SELECT * FROM table_name;

    Y aquí está el resultado final.

    mysql> select * from student;
    +--------+------+-------+---------+---------+--------+-------+
    | name   | id   | maths | physics | biology | social | total |
    +--------+------+-------+---------+---------+--------+-------+
    | George |    2 |    91 |      81 |      94 |     90 |   356 |
    | James  |    3 |    86 |      70 |      73 |     88 |   317 |
    | Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
    | John   |    5 |    94 |      75 |      69 |     79 |   317 |
    | Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
    +--------+------+-------+---------+---------+--------+-------+
    5 rows in set (0.00 sec)

    En el resultado anterior, puede ver que todas las calificaciones de materias se agregan automáticamente para cada estudiante. Entonces, podemos concluir que el activador se invocó con éxito.

    Operaciones de activación adicionales

    Podemos realizar muchas operaciones usando disparadores. Algunos pueden ser simples y otros pueden ser un poco complejos, pero una vez que revisamos las consultas, es fácil de entender. Al emplear instrucciones Transact-SQL, puede habilitar, deshabilitar o eliminar los disparadores usando los siguientes comandos.

    Consulta para verificar si un disparador específico está ahí o no

    Este comando busca el activador especificado en toda la base de datos.

    SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

    Consulta para mostrar activadores

    Todos los activadores que están disponibles en la base de datos activa se mostrarán en la siguiente declaración.

    SHOW TRIGGERS;

    Consulta para deshabilitar el disparador

    El siguiente comando desactiva el activador en la base de datos de trabajo.

    DISABLE TRIGGER trigger_name ON DATABASE;

    También puede especificar un nombre de tabla determinado para deshabilitar un disparador.

    DISABLE TRIGGER trigger_name ON table_name;

    Consulta para habilitar el disparador

    El siguiente comando desactiva primero un disparador específico que se definió en la tabla especificada en la base de datos activa antes de volver a habilitarlo.

    ALTER TABLE table_name DISABLE TRIGGER trigger_name
    
    ALTER TABLE table_name ENABLE TRIGGER trigger_name

    El disparador debe estar deshabilitado, antes de intentar habilitarlo,

    Consulta para habilitar o deshabilitar todos los disparadores en una tabla

    Usando la instrucción SQL anterior, podemos desactivar o activar todos los activadores de tabla a la vez sustituyendo «TODOS» en lugar de un nombre de activador específico.

    ALTER TABLE table_name DISABLE TRIGGER ALL 
    
    ALTER TABLE table_name ENABLE TRIGGER ALL

    Consulta para eliminar o descartar activador

    Se puede eliminar un disparador eliminándolo o eliminando toda la tabla. Cada activador relacionado también se elimina cuando se elimina una tabla.

    DROP TRIGGER [trigger_name];

    Cada vez que se elimina un disparador, los datos relacionados se eliminan de la tabla de datos sys.objects.

    Ventajas de los disparadores

    • Es sencillo crear activadores y el propio activador puede invocar funciones y métodos almacenados.
    • Los usuarios pueden implementar una auditoría simple usando disparadores.
    • Trágicamente, no puede crear restricciones entre entidades en sistemas de bases de datos con SQL Server, aunque puede emular la operación de restricciones utilizando activadores.
    • Las restricciones de integridad se pueden implementar en las bases de datos mediante activadores.
    • Cuando se requiere una validación de grupo en lugar de una verificación fila por fila de los datos recién ingresados ​​o modificados, los disparadores pueden ser útiles.

    Desventajas de los disparadores

    Los activadores de SQL pueden no ser la mejor opción en algunas situaciones debido a sus limitaciones.

    • Los factores desencadenantes deben documentarse con precisión.
    • Debido a la ejecución simultánea de la base de datos a la que es posible que los componentes de la aplicación no puedan acceder, los disparadores pueden ser difíciles de depurar.
    • Las declaraciones DML se vuelven más complejas cuando se utilizan disparadores.
    • Incluso un problema desencadenante menor tiene el potencial de conducir a fallas lógicas en la declaración.

    Conclusión

    Los disparadores son componentes muy útiles de Transact-SQL y SQL, y también puede usarlos en Oracle. El uso de disparadores es crucial cuando se llama a métodos almacenados. Estos SQL Triggers nos permiten analizar los cronogramas de actividad y determinar cómo responder a ellos si es necesario. También podemos buscar una determinada tabla que esté conectada a un disparador para adquirir datos.

    La recursividad se puede habilitar mediante disparadores. Cada vez que un disparador en una tabla ejecuta un comando en la tabla principal, se activa la segunda iteración del disparador, y esto se conoce como disparador recursivo. Esto ayuda al intentar resolver una correlación de identidad.

    Además, los activadores regulan el patrón de actualización que la base de datos puede aceptar. Es muy beneficioso mantener las restricciones de integridad de datos en el sistema de la base de datos si las claves de restricción de SQL no existen, principalmente la clave principal y la clave externa.

    Espero que este artículo le haya resultado útil para aprender sobre SQL Triggers.

    Si desea aprender bases de datos en profundidad, aquí hay algunos recursos excelentes para aprender SQL y NoSQL.