Saltar a un capítulo clave
Explicación de los Disparadores SQL
Un desencadenante es un objeto de base de datos con nombre que realiza automáticamente una acción especificada cuando se produce un evento, como una sentencia INSERT, UPDATE, DELETE o TRUNCATE en una tabla o vista especificada. Los disparadores SQL te permiten realizar acciones adicionales en respuesta a cambios en los datos, ayudando a mantener la integridad de tu base de datos.
Conceptos básicos de los disparadores SQL
En SQL, los disparadores son herramientas importantes para mantener la coherencia de los datos, aplicar reglas de negocio y auditar los cambios en los datos. Algunos conceptos de uso frecuente en el contexto de los disparadores SQL son:- Evento desencadenante: El evento que provoca la ejecución de un desencadenante, como las sentencias INSERT, UPDATE o DELETE.
- Acción del Activador: La acción realizada por el desencadenante, que normalmente implica modificaciones en una o más tablas.
- Evento desencadenante: El suceso que inicia la ejecución del activador. Esto incluye operaciones de manipulación de datos como insertar, actualizar o eliminar registros en una tabla.
- Tabla desencadenante: La tabla en la que se define el evento desencadenante, como la tabla que se modifica o a la que se accede.
Cómo funcionan los disparadores SQL
Cuando se produce un evento que satisface las condiciones definidas en un desencadenador, se ejecuta automáticamente la acción especificada en el desencadenador. He aquí un ejemplo que explica el proceso:Supón que tienes una tienda online con una tabla llamada pedidos. Cada vez que se INSERTA un nuevo pedido, quieres disminuir las existencias disponibles del producto en la cantidad dada. Se puede crear un desencadenante en la tabla pedidos que se ejecute cada vez que se INSERTA un nuevo pedido, y este desencadenante actualizaría automáticamente la tabla existencias.
Tipos de disparadores SQL y casos de uso
Los desencadenantes pueden dividirse en distintos tipos en función del evento desencadenante o del nivel en el que se ejecutan. Comprender estos tipos de desencadenantes te permitirá decidir qué tipo es el adecuado para tu caso de uso concreto.Activadores Antes y Después
Los desencadenantes Antes y Después vienen determinados por el momento de su ejecución:- Disparadores Before
(ANTES DE INSERTAR
,ANTES DE ACTUALIZAR
,ANTES DE ELIMINAR
): Estos desencadenantes se ejecutan antes del evento desencadenante. Se pueden utilizar para modificar los datos antes de que se guarden en la base de datos, lo que resulta útil para la validación o limpieza de datos. - Disparadoresposteriores
(DESPUÉS DE INSERTAR
,DESPUÉS DE ACTUALIZAR
,DESPUÉS DE ELIMINAR
): Estos desencadenantes se ejecutan después del evento desencadenante. Pueden ser útiles para acciones que dependen de los cambios realizados por el evento, como mantener un registro de cambios o actualizar tablas relacionadas.
Es importante tener en cuenta que TRUNCATE no puede tener un desencadenante directamente asociado porque no se registra por filas. Sin embargo, es posible crear un desencadenador en una tabla auxiliar y luego utilizar una sentencia DELETE en esa tabla para desencadenar la acción deseada.
Disparadores de nivel de fila y de nivel de sentencia
Los desencadenadores de nivel de fila y de nivel de sentencia se distinguen por el alcance del evento desencadenante:- Disparadoresa nivel de fila
(PARA CADA FILA
): Estos desencadenantes se ejecutan una vez por cada fila afectada por el evento desencadenante. Son útiles para operaciones que deben aplicarse a registros individuales, como mantener un historial de cambios para cada fila. - Disparadoresde nivel de estado: Estos desencadenantes se ejecutan una vez por cada evento desencadenante, independientemente del número de filas afectadas. Son adecuados para operaciones que deben realizarse una vez por evento, como el mantenimiento de tablas resumen o de auditoría.
Un ejemplo práctico de activador a nivel de fila sería llevar un registro de la última fecha de modificación de cada fila de una tabla. Cuando se INSERTA una nueva fila o se ACTUALIZA una fila existente, el desencadenador actualizaría una columna "last_modified" para la fila afectada.
Ejemplos de trabajo con disparadores SQL
Para crear un desencadenador SQL, primero tendrás que entender la sintaxis de creación de desencadenadores y luego aplicarla a un caso de uso práctico, como crear un desencadenador con fines de auditoría o para mantener la integridad referencial entre tablas relacionadas.Sintaxis para crear un activador SQL
La sintaxis para crear un disparador SQL varía en función del sistema de gestión de bases de datos que utilices, pero la estructura general sigue siendo la misma. Aquí tienes un esquema de la sintaxis básica:CREATE TRIGGER nombre_disparador {AnTES|DesPUÉS} {INSERTAR|ACTUALIZAR|ELIMINAR} EN nombre_tabla [PARA CADA FILA] cuerpo_disparador;
CREATE TRIGGER
: Es el comando que se utiliza para crear un nuevo trigger.nombre_disparador
: Un nombre único para el disparador.ANTES| DESPUÉS
: La temporización del desencadenador, que determina cuándo se ejecuta la acción del desencadenador con respecto al evento desencadenante.INSERTAR|ACTUALIZAR|ELIMINAR
: El evento desencadenante que activa el activador.ON nombre_tabla
: Especifica la tabla sobre la que crear el desencadenador.PARA CADA FILA
: Modificador opcional para disparadores a nivel de fila.trigger_body
: El código que se ejecutará cuando se active el disparador.
Caso práctico: Creación de un activador
Veamos un ejemplo de creación de un desencadenador para mantener un historial de cambios en el salario de un empleado. Supongamos que tienes dos tablas, una llamada 'empleados' y otra llamada 'empleados_salario_historial'. Cada vez que se actualice el salario de un empleado en la tabla 'empleados', queremos añadir una nueva fila en la tabla 'empleados_salario_historial'. Aquí tienes el código SQL para crear el trigger:CREATE TRIGGER trg_salary_history AFTER UPDATE OF salary ON employees FOR EACH ROW INSERT INTO employees_salary_history (employee_id, old_salary, new_salary, changed_on) VALUES (:old.employee_id, :old.salary, :new.salario
, CURRENT_TIMESTAMP);En este ejemplo, el desencadenador se llama "trg_salary_history", se ejecuta tras una actualización de la columna "salario" de la tabla "empleados", y es un desencadenador a nivel de fila, que se especifica mediante la cláusula "FOR EACH ROW". Cuando el disparador se ejecuta, inserta una nueva fila en la tabla 'employees_salary_history' con el employee_id, el old_salary, el new_salary y la marca de tiempo del cambio.
Modificar y eliminar disparadores SQL
Una vez que hayas creado un disparador, puede que necesites modificarlo o eliminarlo por varias razones, como solucionar problemas o eliminar funcionalidades redundantes. Esta sección detallará la alteración y eliminación de disparadores SQL.Ejemplo de modificación de un disparador SQL
Para modificar un disparador, utiliza la sintaxis 'ALTER TRIGGER'. Supongamos que quieres modificar el disparador 'trg_salary_history' para que registre el user_id de la persona que realizó la actualización del salario del empleado. Para ello, tienes que añadir una nueva columna "updated_by" en la tabla "employees_salary_history" y modificar el desencadenador en consecuencia. Aquí tienes el código SQL para modificar el desencadenador e incluir la columna 'updated_by':ALTER TRIGGER trg_salary_history AFTER UPDATE OF salary ON employees FOR EACH ROW INSERT INTO employees_salary_history (employee_id, old_salary, new_salary, changed_on, updated_by) VALUES (:antiguo.employee_id, :old.salary, :new.salary, CURRENT_TIMESTAMP, USER);Este código modifica el disparador 'trg_salary_history' añadiendo 'updated_by' a la sentencia INSERT en el cuerpo del disparador.
Ejemplo de eliminación de un disparador SQL
Para eliminar un disparador, utiliza la sintaxis 'DROP TRIGGER'. Si determinas que el disparador 'trg_salary_history' ya no es necesario y quieres eliminarlo de la base de datos, puedes utilizar el siguiente código SQL:DROP TRIGGER trg_salary_history;
Este código elimina el disparador 'trg_salary_history' de la base de datos. Ten en cuenta que eliminar un desencadenador no afecta a la tabla ni a los datos de la tabla, sólo elimina la funcionalidad del desencadenador.
Disparadores SQL vs Funciones
Tanto los disparadores SQL como las funciones sirven para fines específicos y son componentes importantes de los sistemas de gestión de bases de datos. Sin embargo, difieren en términos de funcionalidad, finalidad y uso:Disparadores SQL:
- Se ejecutan automáticamente cuando se produce un evento especificado (por ejemplo, INSERTAR, ACTUALIZAR o ELIMINAR).
- Asociados a una tabla o vista específica.
- Se utilizan principalmente para mantener la integridad de los datos, aplicar reglas de negocio y auditar los cambios en los datos.
- Se ejecutan cuando se llaman explícitamente, como una función normal en un lenguaje de programación.
- Devuelven un único valor o una tabla.
- Se utilizan para realizar cálculos, análisis sintáctico o tareas de manipulación de datos en los datos de entrada y devolver el resultado.
Cuándo utilizar activadores y cuándo utilizar funciones
Es crucial determinar el escenario de uso adecuado para sacar el máximo partido de los desencadenadores y las funciones SQL. He aquí algunas directrices generales sobre cuándo utilizar cada uno:- Utilizar Disparadores: Elige disparadores cuando quieras automatizar tareas en respuesta a eventos de manipulación de datos, realizar comprobaciones de coherencia entre tablas o mantener registros históricos.
- Utilizar funciones: Considera las funciones cuando necesites encapsular lógica reutilizable, realizar cálculos complejos o manipular datos sin desencadenar un evento. Las funciones deben utilizarse cuando la lógica requiera flexibilidad y no dependa de eventos específicos de la tabla.
Consideraciones sobre el rendimiento
Al comparar los aspectos de rendimiento de los activadores y las funciones SQL, hay que tener en cuenta ciertos factores:- Disparadores: Dado que los desencadenantes se ejecutan automáticamente, pueden introducir una sobrecarga de procesamiento y ralentizar las operaciones de manipulación de datos. El uso excesivo de triggers o la implementación de lógica compleja dentro de los triggers puede afectar negativamente al rendimiento de la base de datos.
- Funciones: Las funciones pueden optimizarse para el rendimiento, ya que se llaman explícitamente, y su tiempo de ejecución suele ser más rápido. Sin embargo, las funciones mal escritas también pueden afectar al rendimiento general del sistema si consumen muchos recursos o se llaman con frecuencia dentro de las operaciones de manipulación de datos.
Recomendaciones para utilizar disparadores y funciones
Para aprovechar al máximo los desencadenadores y las funciones SQL, sigue estas prácticas recomendadas:- Disparadores:
- Evita utilizar un número excesivo de desencadenadores, ya que esto puede entorpecer el rendimiento de la base de datos.
- Mantén la lógica de los disparadores simple, limpia y centrada en un único propósito.
- Utiliza los disparadores principalmente para reforzar la integridad y coherencia de los datos entre tablas relacionadas.
- Funciones:
- Optimiza el rendimiento de las funciones minimizando el consumo de recursos y evitando las llamadas a funciones anidadas.
- Encapsula los cálculos complejos y la lógica de manipulación de datos en funciones para mejorar la organización y reutilización del código.
- Utiliza funciones integradas siempre que sea posible, ya que suelen ser más eficientes que las funciones definidas por el usuario.
Trabajar con disparadores SQL Tablas insertadas
Una tabla insertada es una tabla temporal en memoria creada por el sistema de gestión de bases de datos (SGBD) cada vez que se ejecuta un activador debido a un evento INSERTAR, ACTUALIZAR o ELIMINAR. Las tablas insertadas contienen los nuevos valores actualizados para las operaciones de manipulación de datos y el desencadenador puede acceder a ellas durante su ejecución para referenciar o comparar los datos.
Finalidad de la tabla insertada
Las tablas insertadas tienen varias finalidades en el contexto de los desencadenadores SQL, entre ellas:- Almacenando nuevos valores para las filas insertadas o actualizadas, permitiendo que el activador haga referencia o compare estos valores.
- Facilitar la implementación de la lógica empresarial, la aplicación de restricciones y las funciones de auditoría, proporcionando un medio para examinar los cambios realizados.
- Mejorar la integridad de los datos, permitiendo que el desencadenador detecte discrepancias entre los valores de los datos antiguos y los nuevos, y aplique las acciones apropiadas antes de consignar los cambios.
Cómo se utilizan los activadores SQL Tabla insertada
Cuando se produce un evento de manipulación de datos, el SGBD crea una tabla insertada y la rellena con la(s) fila(s) actualizada(s) implicada(s) en el evento desencadenante. A continuación, el desencadenador puede acceder a la tabla insertada mediante una palabra clave especial "inserted". Esto permite al desencadenante manipular o comparar los nuevos datos con los antiguos antes de confirmar o revertir los cambios. En el caso de:- Operaciones INSERT: La tabla insertada contiene todas las filas recién añadidas.
- Operaciones UPDATE: La tabla insertada contiene las filas actualizadas con sus nuevos valores.
- Operaciones DELETE: La tabla insertada no se utiliza, ya que las filas eliminadas se almacenan en otra tabla temporal llamada tabla "eliminada".
Ejemplos prácticos con SQL Triggers Tablas insertadas
Aquí tienes algunos ejemplos de uso de SQL Triggers.
Ejemplo: Registro de cambios en una tabla
Consideremos un escenario en el que quieres registrar los cambios realizados en la tabla empleados, registrando el salario actualizado de cada empleado afectado. Para conseguirlo, crea un desencadenador que utilice la tabla insertada para extraer los nuevos valores salariales y almacenarlos en una tabla de auditoría independiente.CREATE TRIGGER trg_salary_log AFTER UPDATE OF salary ON employees FOR EACH ROW BEGIN INSERT INTO salary_audit (employee_id, old_salary, new_salary, modified_at) VALUES (:old.employee_id, :old.salary, :new.salary, CURRENT_TIMESTAMP); END;En este ejemplo, el activador trg_salary_log se activa después de que se actualice la columna de salario de la tabla de empleados. A continuación, inserta una nueva fila en la tabla salary_audit, capturando el employee_id, el old_salary, el new_salary y el timestamp de modificación.
Ejemplo: Garantizar la integridad de los datos con activadores SQL insertados
Considera un escenario en el que tienes una tabla llamada "pedidos" y una tabla llamada "productos", y quieres asegurarte de que sólo se puede hacer un pedido de productos disponibles con existencias suficientes. Para conseguirlo, se puede crear un activador que utilice la tabla insertada para comparar las cantidades de pedido solicitadas con las existencias disponibles en la tabla de productos.CREATE TRIGGER trg_validate_order BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE @stock INT; SELECT stock INTO @stock FROM products WHERE product_id = :new.product_id; IF @stock < :new.quantity THEN ROLLBACK; -- Si la cantidad solicitada es superior a las existencias disponibles, retrocede la transacción RETURN; END IF; END;En este ejemplo, el activador trg_validate_order se activa antes de insertar una nueva fila en la tabla de pedidos. Comprueba la cantidad solicitada del pedido con las existencias disponibles utilizando los valores insertados en la tabla. Si la cantidad solicitada supera las existencias disponibles, la transacción se anula, garantizando la integridad de los datos en la base de datos.
Triggers SQL - Puntos clave
Disparadores SQL: Objetos de base de datos con nombre que ejecutan automáticamente acciones (INSERTAR, ACTUALIZAR, ELIMINAR, TRUNCAR) cuando se produce un evento en una tabla o vista especificada, manteniendo la integridad de los datos en las bases de datos.
Conceptos básicos de los desencadenantes SQL: Evento desencadenante (por ejemplo, INSERTAR, ACTUALIZAR, ELIMINAR), Acción desencadenante (modificaciones de tablas), Evento desencadenante (operaciones de manipulación de datos), Tabla desencadenante (tabla que se modifica).
Tipos de Disparadores SQL: Disparadores Before (antes del evento desencadenante), Disparadores After (después del evento desencadenante), Disparadores Row-Level (ejecutados por cada fila afectada), Disparadores Statement-Level (ejecutados una vez por evento).
Diferencia entre Disparadores SQL y Funciones: Los Disparadores se ejecutan automáticamente en respuesta a eventos de manipulación de datos, mientras que las Funciones se llaman explícitamente para devolver valores. Los Triggers refuerzan la integridad de los datos, mientras que las Funciones realizan cálculos y manipulación de datos.
Disparadores SQL insertados: Tabla temporal en memoria creada durante la ejecución del desencadenante, que permite al desencadenante referenciar y comparar nuevos valores para las operaciones de manipulación de datos, garantizando la integridad de los datos.
Aprende más rápido con las 13 tarjetas sobre Disparadores SQL
Regístrate gratis para acceder a todas nuestras tarjetas.
Preguntas frecuentes sobre Disparadores SQL
Acerca de StudySmarter
StudySmarter es una compañía de tecnología educativa reconocida a nivel mundial, que ofrece una plataforma de aprendizaje integral diseñada para estudiantes de todas las edades y niveles educativos. Nuestra plataforma proporciona apoyo en el aprendizaje para una amplia gama de asignaturas, incluidas las STEM, Ciencias Sociales e Idiomas, y también ayuda a los estudiantes a dominar con éxito diversos exámenes y pruebas en todo el mundo, como GCSE, A Level, SAT, ACT, Abitur y más. Ofrecemos una extensa biblioteca de materiales de aprendizaje, incluidas tarjetas didácticas interactivas, soluciones completas de libros de texto y explicaciones detalladas. La tecnología avanzada y las herramientas que proporcionamos ayudan a los estudiantes a crear sus propios materiales de aprendizaje. El contenido de StudySmarter no solo es verificado por expertos, sino que también se actualiza regularmente para garantizar su precisión y relevancia.
Aprende más