SQL Server 2000 - 12 Triggers (Desencadenadores).pdf

Embed Size (px)

Citation preview

  • 1Triggers (Desencadenadores)Triggers (Desencadenadores)

    FEMEPAFEMEPAMnica Frey GrimmMnica Frey Grimm

    SQL Server 2000SQL Server 2000

    SQL Server 2000SQL Server 2000TriggersTriggers

    Un trigger es un SP que se ejecuta automticamente cada vez Un trigger es un SP que se ejecuta automticamente cada vez que tiene lugar la accin para la que se ha definido.que tiene lugar la accin para la que se ha definido.

    No se pueden invocar directamente, se puede ejecutar la No se pueden invocar directamente, se puede ejecutar la accin que activa el trigger.accin que activa el trigger.

    No admite parmetros y no puede usar la instruccin No admite parmetros y no puede usar la instruccin RETURN.RETURN.

    Puede devolver resultados (no se recomienda)Puede devolver resultados (no se recomienda) Se ejecutan en segundo plano y no deberan devolver ms Se ejecutan en segundo plano y no deberan devolver ms

    que mensajes de error, cuando sea necesario.que mensajes de error, cuando sea necesario. Se pueden definir varios trigger para cada accin INSERT, Se pueden definir varios trigger para cada accin INSERT,

    UPDATE o DELETE.UPDATE o DELETE. Dentro del Trigger se puede hacer referencia a objetos de Dentro del Trigger se puede hacer referencia a objetos de

    otras bases de datos (integridad referencial entre objetos de otras bases de datos (integridad referencial entre objetos de distintas BD)distintas BD)

    Beneficios

    FEMEPA SQL Server 2000 Mnica Frey Grimm

  • 2SQL Server 2000SQL Server 2000TriggersTriggers

    Se pueden definir varios trigger para cada accin Se pueden definir varios trigger para cada accin INSERT, UPDATE o DELETE.INSERT, UPDATE o DELETE.

    No representan una gran sobrecarga de trabajo para No representan una gran sobrecarga de trabajo para SQL Server.SQL Server.

    No es recomendable complicar la lgica interna de los No es recomendable complicar la lgica interna de los desencadenadores.desencadenadores.

    Beneficios

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    SQL Server 2000SQL Server 2000TriggersTriggers

    Tablas INSERTED y DELETED

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    La tabla INSERTEDLa tabla INSERTED. Contiene:. Contiene: Las nuevas filas que se han insertado mediante la Las nuevas filas que se han insertado mediante la

    instruccin INSERT.instruccin INSERT. Los nuevos valores para las filas que se han modificado Los nuevos valores para las filas que se han modificado

    mediante la instruccin UPDATE.mediante la instruccin UPDATE.

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

    instruccin UPDATE.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.

  • 3SQL Server 2000SQL Server 2000TriggersTriggers

    Tipos de trigger segn el momento de su ejecucin

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    Desencadenadores INSTEAD OFDesencadenadores INSTEAD OF. Se activan en lugar . Se activan en lugar de la accin original, antes de que tenga lugar la de la accin original, antes de que tenga lugar la modificacin del objeto base.modificacin del objeto base.

    Desencadenadores AFTERDesencadenadores AFTER. Se activan . Se activan inmediatamente despus de la modificacin de los datos inmediatamente despus de la modificacin de los datos de la tabla base.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.

    SQL Server 2000SQL Server 2000TriggersTriggers

    Desencadenadores INSTEAD OF

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    Se activan automticamente cuando se ejecuta la instruccin Se activan automticamente cuando se ejecuta la instruccin definida.definida.

    Se activa antes de la ejecucin de la accin. La tabla base an Se activa antes de la ejecucin de la accin. La tabla base an no ha no ha sufrido modificaciones.sufrido modificaciones.

    Se puede acceder a las tablas Se puede acceder a las tablas InsertedInserted y y DeletedDeleted.. Se pueden usar para controlar los datos antes de que tenga lugarSe pueden usar para controlar los datos antes de que tenga lugar la la

    modificacin, en forma ms compleja de la permitida por las modificacin, en forma ms compleja de la permitida por las restricciones restricciones CHECKCHECK..

    Dependiendo de las condiciones evaluadas podemos decidir entre Dependiendo de las condiciones evaluadas podemos decidir entre hacer efectivos los cambios solicitados o dejarlos totalmente sihacer efectivos los cambios solicitados o dejarlos totalmente sin n efecto.efecto.

    En una tabla que tenga definida una restriccin FOREIGN KEY con En una tabla que tenga definida una restriccin FOREIGN KEY con operaciones CASCADE no se puede crear un trigger INSTEAD OF.operaciones CASCADE no se puede crear un trigger INSTEAD OF.

  • 4SQL Server 2000SQL Server 2000TriggersTriggers

    Desencadenadores INSTEAD OF

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    INSTEAD OF INSERTINSTEAD OF INSERT. Permite cancelar en forma parcial o total, . Permite cancelar en forma parcial o total, una operacin INSERT.una operacin INSERT.

    INSTEAD OF UPDATEINSTEAD OF UPDATE. Brinda la posibilidad de controlar los . Brinda la posibilidad de controlar los cambios antes de que se apliquen a los datos y decidir por ltimcambios antes de que se apliquen a los datos y decidir por ltimo o cuales aplicar.cuales aplicar.

    INSTEAD OF DELETEINSTEAD OF DELETE. Permite evitar la eliminacin de filas . Permite evitar la eliminacin de filas especficas sin necesidad de cancelar transacciones.especficas sin necesidad de cancelar transacciones.

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

    SQL Server 2000SQL Server 2000TriggersTriggers

    Desencadenadores AFTER

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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.

  • 5SQL Server 2000SQL Server 2000TriggersTriggers

    Creacin y eliminacin de Triggers

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    CREATE TRIGGER NombreTrigger

    ON {NombreTabla/NombreVista}

    [WITH ENCRYPTION]

    {FOR/AFTER/INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]}

    AS

    CREATE TRIGGER tr_CustomersON CustomersAFTER INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER tr_CustomersON CustomersFOR INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

    SQL Server 2000SQL Server 2000TriggersTriggers

    Creacin y eliminacin de Triggers

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    CREATE TRIGGER tr_CustomersON CustomersAFTER INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER tr_CustomersON CustomersFOR INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER isr_CustomersON CustomersAFTER INSERTAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER tr_CustomersON CustomersWITH ENCRYPTIONFOR INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER isr_CustomersON CustomersINSTEAD OF INSERTAS-- Inserte sus instrucciones aqu

    CREATE TRIGGER tr_CustomersON CustomersINSTEAD OF INSERT, UPDATE, DELETEAS-- Inserte sus instrucciones aqu

  • 6SQL Server 2000SQL Server 2000TriggersTriggers

    Determinacin del orden de ejecucin

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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.

    CREATE TRIGGER tr1_Customers ON CustomersAFTER UPDATEASPRINT 'Este es el desencadenador tr1'

    CREATE TRIGGER tr2_Customers ON CustomersAFTER UPDATEASPRINT 'Este es el desencadenador tr2'

    Creamos tres trigger de prueba para modificar su orden de ejecucin

    SQL Server 2000SQL Server 2000TriggersTriggers

    Determinacin del orden de ejecucin

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    CREATE TRIGGER tr3_Customers ON CustomersAFTER UPDATEASPRINT 'Este es el desencadenador tr3'

    UPDATE CustomersSET ContactName = ContactName

    Probamos el orden de salida con una operacin simulada

    -- Indica que el desencadenador tr3 ser el primero en ejecutarseEXEC sp_settriggerorder 'tr3_Customers', 'FIRST', 'UPDATE'

    -- Indica que el desencadenador tr2 ser el primero en ejecutarseEXEC sp_settriggerorder 'tr2_Customers', 'LAST', 'UPDATE'

    Indicamos cul ser el primer trigger y el ltimo en ejecutarse

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

    UPDATE Customers SET ContactName = ContactName

  • 7SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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.

    SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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).

  • 8SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    CREATE TRIGGER tr_OrderDetailsON [Order Details]AFTER UPDATEAS-- Verificamos si hubo cambios en la clave principalIF UPDATE(OrderID)BEGINPRINT 'No se permiten cambios a la clave principal'ROLLBACK TRANEND-- Verificamos si hubo cambios en las columnas 2, 3 y 5IF ((COLUMNS_UPDATED() & (22)) > 0)BEGINIF ((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

    SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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

    Crea el siguiente grupo de sentencias SQL y ejectalas

  • 9SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    Modificamos las columnas ProductID y UnitPriceSe modific la columna ProductIDSe modific la columna UnitPrice

    (2155 filas afectadas)

    Modificamos solamente la columna QuantitySe modific la columna Quantity

    (2155 filas afectadas)

    Modificamos OrderIDNo se permiten cambios a la clave principal

    Debe dar el resultado siguiente:

    SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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 CustomersFOR 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

  • 10

    SQL Server 2000SQL Server 2000TriggersTriggers

    Controlar la modificacin de columnas especficas

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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

    SQL Server 2000SQL Server 2000TriggersTriggers

    Modificacin de Triggers

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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.

  • 11

    SQL Server 2000SQL Server 2000TriggersTriggers

    Deshabilitar los desencadenadores

    FEMEPA SQL Server 2000 Mnica Frey Grimm

    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 EmployeesDISABLE TRIGGER tr_Employees, isr_Employees, udt_Employees