Sie sind auf Seite 1von 11

SQL Server 2000

Triggers (Desencadenadores)
FEMEPA
Mnica Frey Grimm

SQL Server 2000


Triggers
Beneficios








Un trigger es un SP que se ejecuta automticamente cada vez


que tiene lugar la accin para la que se ha definido.
No se pueden invocar directamente, se puede ejecutar la
accin que activa el trigger.
No admite parmetros y no puede usar la instruccin
RETURN.
Puede devolver resultados (no se recomienda)
Se ejecutan en segundo plano y no deberan devolver ms
que mensajes de error, cuando sea necesario.
Se pueden definir varios trigger para cada accin INSERT,
UPDATE o DELETE.
Dentro del Trigger se puede hacer referencia a objetos de
otras bases de datos (integridad referencial entre objetos de
distintas BD)

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Beneficios




Se pueden definir varios trigger para cada accin


INSERT, UPDATE o DELETE.
No representan una gran sobrecarga de trabajo para
SQL Server.
No es recomendable complicar la lgica interna de los
desencadenadores.

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Tablas INSERTED y DELETED


La tabla INSERTED.
INSERTED. Contiene:
Las nuevas filas que se han insertado mediante la
instruccin INSERT.
Los nuevos valores para las filas que se han modificado
mediante la instruccin UPDATE.

La tabla DELETED.
DELETED. Contiene:
Las filas eliminadas por una instruccin DELETE.
Los valores viejos de las filas modificadas por una
instruccin UPDATE.

Si la accin original modific varias filas a la vez, el trigger se activar una


sola vez y las tablas INSERTED y DELETED contendrn varias filas con las
modificaciones.
FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Tipos de trigger segn el momento de su ejecucin


Desencadenadores INSTEAD OF.


OF. Se activan en lugar
de la accin original, antes de que tenga lugar la
modificacin del objeto base.
Desencadenadores
AFTER.
Se
activan
AFTER.
inmediatamente despus de la modificacin de los datos
de la tabla base.

Una tabla puede tener un nmero ilimitado de desencadenadores AFTER


para cada accin, pero solamente un desencadenador INSTEAD OF por
accin.
Las vistas slo pueden tener desencadenadores INSTEAD OF.

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Desencadenadores INSTEAD OF





Se activan automticamente cuando se ejecuta la instruccin


definida.
Se activa antes de la ejecucin de la accin. La tabla base an no ha
sufrido modificaciones.
Se puede acceder a las tablas Inserted y Deleted.
Deleted.
Se pueden usar para controlar los datos antes de que tenga lugar la
modificacin, en forma ms compleja de la permitida por las
restricciones CHECK.
CHECK.
Dependiendo de las condiciones evaluadas podemos decidir entre
hacer efectivos los cambios solicitados o dejarlos totalmente sin
sin
efecto.
En una tabla que tenga definida una restriccin FOREIGN KEY con
operaciones CASCADE no se puede crear un trigger INSTEAD OF.

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Desencadenadores INSTEAD OF
Para cada tabla o vista se puede definir un solo desencadenador INSTEAD
OF por accin activadora (INSERT, UPDATE y DELETE):



INSTEAD OF INSERT.
INSERT. Permite cancelar en forma parcial o total,
una operacin INSERT.
INSTEAD OF UPDATE.
UPDATE. Brinda la posibilidad de controlar los
cambios antes de que se apliquen a los datos y decidir por ltimo
ltimo
cuales aplicar.
INSTEAD OF DELETE.
DELETE. Permite evitar la eliminacin de filas
especficas sin necesidad de cancelar transacciones.

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Desencadenadores AFTER
Se ejecutan una vez modificados los datos. Sin embargo, como la
transaccin todava sigue en curso, podemos decidir la cancelacin
de la accin.
A diferencia de los desencadenadores INSTEAD OF, para confirmar
la transaccin no hace falta hacer nada especial; sta se
completar automticamente a menos que decidamos descartarla.
Se puede definir un nmero indefinido de desencadenadores
AFTER para cada tabla y accin.

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Creacin y eliminacin de Triggers
CREATE TRIGGER NombreTrigger
ON {NombreTabla/NombreVista}
[WITH ENCRYPTION]
{FOR/AFTER/INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]}
AS
<Cuerpo de la trigger>
CREATE TRIGGER tr_Customers
ON Customers
AFTER INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER tr_Customers


ON Customers
FOR INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Creacin y eliminacin de Triggers
CREATE TRIGGER tr_Customers
ON Customers
AFTER INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER tr_Customers


ON Customers
FOR INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER isr_Customers


ON Customers
AFTER INSERT
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER tr_Customers


ON Customers
WITH ENCRYPTION
FOR INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER tr_Customers


ON Customers
INSTEAD OF INSERT, UPDATE, DELETE
AS
-- Inserte sus instrucciones aqu

CREATE TRIGGER isr_Customers


ON Customers
INSTEAD OF INSERT
AS
-- Inserte sus instrucciones aqu

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Determinacin del orden de ejecucin
Es imposible determinar un orden de ejecucin especfico para los
desencadenadores definidos para una misma accin.
Se puede seleccionar que desencadenador se ejecutar en primer
lugar y cul lo har al final.
Se

utiliza

el

procedimiento

almacenado

de

sistema

sp_settriggerorder.
Creamos tres trigger de prueba para modificar su orden de ejecucin
CREATE TRIGGER tr1_Customers
ON Customers
AFTER UPDATE
AS
PRINT 'Este es el desencadenador tr1'

CREATE TRIGGER tr2_Customers


ON Customers
AFTER UPDATE
AS
PRINT 'Este es el desencadenador tr2'

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Determinacin del orden de ejecucin
CREATE TRIGGER tr3_Customers
ON Customers
AFTER UPDATE
AS
PRINT 'Este es el desencadenador tr3'

Probamos el orden de salida con


una operacin simulada
UPDATE Customers
SET ContactName = ContactName

Indicamos cul ser el primer trigger y el ltimo en ejecutarse


-- Indica que el desencadenador tr3 ser el primero en ejecutarse
EXEC sp_settriggerorder 'tr3_Customers', 'FIRST', 'UPDATE'
-- Indica que el desencadenador tr2 ser el primero en ejecutarse
EXEC sp_settriggerorder 'tr2_Customers', 'LAST', 'UPDATE'

Probamos el orden de salida con la operacin simulada Qu ocurre?


UPDATE Customers SET ContactName = ContactName

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
Dentro de un desencadenador podemos saber si una
columna ha sufrido modificaciones.
Funcin UPDATE(). El valor de esta funcin es TRUE
cuando la columna fue modificada.
COLUMNS_UPDATED(). Devuelve un patrn de bits
varbinary que indica qu columnas de la tabla se
insertaron o se actualizaron. Cada bit es 1 si la columna
sufri cambios y 0 en caso contrario.
FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
La funcin COLUMNS_UPDATED devuelve los bits en orden de
izquierda a derecha, siendo el bit menos significativo el primero de
la izquierda. El primer bit de la izquierda representa la primera
columna de la tabla, el siguiente representa la segunda columna,
etc.
COLUMNS_UPDATED devuelve varios bytes si la tabla en que se
ha creado el desencadenador contiene ms de 8 columnas, siendo
el
menos
significativo
el
primero
de
la
izquierda.
COLUMNS_UPDATED devolver el valor TRUE en todas las
columnas de las acciones INSERT porque en las columnas se
insertaron valores explcitos o implcitos (NULL).
FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
CREATE TRIGGER tr_OrderDetails
ON [Order Details]
AFTER UPDATE
AS
-- Verificamos si hubo cambios en la clave principal
IF UPDATE(OrderID)
BEGIN
PRINT 'No se permiten cambios a la clave principal'
ROLLBACK TRAN
END
-- Verificamos si hubo cambios en las columnas 2, 3 y 5
IF ((COLUMNS_UPDATED() & (22)) > 0)
BEGIN
IF ((COLUMNS_UPDATED() & 2) = 2) PRINT 'Se modific la columna ProductID'
IF ((COLUMNS_UPDATED() & 4) = 4) PRINT 'Se modific la columna UnitPrice'
IF ((COLUMNS_UPDATED() & 16) = 16) PRINT 'Se modific la columna Quantity'
END

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
Crea el siguiente grupo de sentencias SQL y ejectalas
PRINT CHAR(10) + 'Modificamos las columnas ProductID y UnitPrice'
UPDATE [Order Details] SET ProductID = ProductID, UnitPrice = UnitPrice
PRINT CHAR(10) + 'Modificamos solamente la columna Quantity'
UPDATE [Order Details] SET Quantity = Quantity
PRINT CHAR(10) + 'Modificamos OrderID'
UPDATE [Order Details] SET OrderID = OrderID

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
Debe dar el resultado siguiente:
Modificamos las columnas ProductID y UnitPrice
Se modific la columna ProductID
Se modific la columna UnitPrice
(2155 filas afectadas)
Modificamos solamente la columna Quantity
Se modific la columna Quantity
(2155 filas afectadas)
Modificamos OrderID
No se permiten cambios a la clave principal

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
Si tiene que probar actualizaciones que afectan a otras columnas que no
sean las 8 primeras de una tabla, debe utilizar la funcin SUBSTRING
para probar si COLUMNS_UPDATED devuelve el bit correcto.
CREATE TRIGGER tr1
ON Customers
FOR UPDATE
AS
IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=20 AND
(SUBSTRING(COLUMNS_UPDATED(),2,1)=1 )
PRINT 'Las columnas 3, 5 y 9 han sido actualizadas'
GO
UPDATE Customers SET ContactName=ContactName, Address=Address,
Country=Country
GO

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Controlar la modificacin de columnas especficas
La funcin POWER Devuelve el valor de la expresin indicada elevada a la
potencia especificada.
Sintaxis
POWER ( numeric_expression , y )
IF (SUBSTRING(COLUMNS_UPDATED(),4,1) & 28) > 0
-- Estas dos lneas hacen exactamente lo mismo
IF (SUBSTRING(COLUMNS_UPDATED(),4,1) &
(POWER(2, (3-1)) + POWER(2, (4-1)) + POWER(2, (5-1))) > 0

FEMEPA SQL Server 2000

Mnica Frey Grimm

SQL Server 2000


Triggers
Modificacin de Triggers
Para modificar un Trigger existente se utiliza la instruccin ALTER
TRIGGER.
Las sintaxis de ALTER TRIGGER es idntica a la de CREATE TRIGGER.
Como los desencadenadores son objetos independientes, ningn objeto
depende de ellos.
Podemos eliminarlos y volver a crearlos cada vez que sea necesario.
DROP TRIGGER se utiliza para borrar un desencadenador.

FEMEPA SQL Server 2000

Mnica Frey Grimm

10

SQL Server 2000


Triggers
Deshabilitar los desencadenadores
Para acelerar algunos procesos se puede deshabilitar temporalmente un
desencadenador.
Para deshabilitar un Trigger se utiliza la instruccin ALTER TABLE con la
opcin DISABLE TRIGGER.
Para volver a activar el Trigger se utiliza la instruccin ALTER TABLE con
la opcin ENABLE TRIGGER.
ALTER TABLE [Order Details]
DISABLE TRIGGER tr_OrderDetails
ALTER TABLE [Order Details]
ENABLE TRIGGER tr_OrderDetails
ALTER TABLE Employees
DISABLE TRIGGER tr_Employees, isr_Employees, udt_Employees
FEMEPA SQL Server 2000

Mnica Frey Grimm

11

Das könnte Ihnen auch gefallen