sql >> Base de Datos >  >> RDS >> Sqlserver

Crear un disparador DML en SQL Server

En SQL Server, puede usar CREATE TRIGGER instrucción para crear un disparador.

Un disparador es un tipo especial de procedimiento almacenado que se ejecuta automáticamente cuando ocurre un evento en el servidor de la base de datos.

Puede crear un activador DML, un activador DDL o un activador de inicio de sesión.

Este artículo proporciona un ejemplo de creación de un disparador DML.

¿Qué es un disparador DML?

Un disparador DML es un disparador que se ejecuta cuando un usuario intenta modificar datos a través de un evento de lenguaje de manipulación de datos (DML).

Los eventos DML incluyen INSERT , UPDATE o DELETE declaraciones. Los disparadores DML se pueden usar para hacer cumplir las reglas comerciales y la integridad de los datos, consultar otras tablas e incluir declaraciones T-SQL complejas.

El activador y la declaración que lo activa se tratan como una sola transacción, que se puede revertir desde dentro del activador.

Ejemplo

Este es un ejemplo para demostrar cómo funcionan los activadores DML.

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0
);

CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);

En este ejemplo, creo una tabla y también creo un activador que se activará cada vez que se inserte o actualice una fila en esa tabla.

En este caso, el disparador suma 1 al c3 columna cada vez que se insertan o actualizan datos.

Llamé al disparador trg_t1 . Seguí esa parte con ON t1 , lo que significa que el disparador se ejecutará en la tabla llamada t1 .

Alternativamente, puede especificar una vista para que se ejecute el disparador, aunque solo puede hacer referencia a una vista mediante INSTEAD OF disparador (en este caso, reemplace AFTER con INSTEAD OF ). Además, no puede definir activadores DML en tablas temporales locales o globales.

AFTER especifica que el activador DML se activa solo cuando todas las operaciones especificadas en la instrucción SQL activadora se han iniciado correctamente. Alternativamente, puede especificar FOR aquí.

Otra alternativa es usar INSTEAD OF , que ejecutará el activador en su lugar de la instrucción SQL desencadenante. Por lo tanto, esto anula las acciones de las declaraciones desencadenantes.

¿Qué es el inserted? ¿Mesa?

En mi disparador, puedo averiguar qué fila se actualizó consultando el inserted mesa.

SQL Server crea y administra una tabla llamada inserted , que es una tabla temporal residente en la memoria que almacena copias de las filas afectadas durante INSERT y UPDATE declaraciones. Durante una transacción de inserción o actualización, se agregan nuevas filas tanto al inserted la tabla y la tabla de activación. Las filas de la tabla insertada son copias de las nuevas filas de la tabla desencadenante.

SQL Server también crea y mantiene una tabla similar llamada eliminada, que almacena copias de las filas afectadas durante DELETE y UPDATE declaraciones. Durante la ejecución de un DELETE o UPDATE instrucción, las filas se eliminan de la tabla desencadenante y se transfieren a la tabla eliminada.

Ejecutar el disparador

Ahora que se han creado la tabla y su activador, ejecutemos algunas sentencias SQL que lo activarán.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Resultado:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 0    | 1    |
+------+------+------+------+

Entonces podemos ver que el disparador funcionó como se esperaba. Cuando inserté una fila, solo especifiqué un valor para el c1 columna, pero el disparador aseguró que el c3 También se actualizó la columna.

Tenga en cuenta que el valor predeterminado para todas las columnas es 0 (como se especificó cuando creé la tabla), y el activador agregó 1 a eso.

Realicemos una UPDATE operación en la misma columna.

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Resultado:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 0    | 2    |
+------+------+------+------+

Una vez más, el c3 la columna también fue actualizada por el disparador.

Ahora actualicemos el c2 columna.

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Resultado:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 3    |
+------+------+------+------+

Entonces, una vez más, el c3 la columna es actualizada por el disparador.

Este activador en particular se activa cada vez que se actualiza cualquier otra columna en la misma fila.

También puede usar IF UPDATE(column_name) para buscar una actualización en una sola columna, o COLUMNS_UPDATED() para buscar actualizaciones en varias columnas.