martes, 5 de abril de 2011

Trigger Transact Sql




Triggers en Transact SQL

    Un trigger( o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos.
    SQL Server proporciona los siguientes tipos de triggers:
  • Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
  • Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.

Trigger DML.

    Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
    La sintaxis general de un trigger es la siguiente.


CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name>

ON <Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
    Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted.

    Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deletedes la misma que tiene la tabla que ha desencadenado la ejecución del trigger.
    La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacia en una operación DELETE.
    En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacia en una operacion INSERT.
    ¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la única en la que inserted y deleted tienen datos simultaneamente.
    No puede se modificar directamente los datos de estas tablas.
    El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla cuentas.


CREATE TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
    La siguiente instrucción provocará que el trigger se ejecute:

UPDATE CUENTAS
SET SALDO = SALDO + 10
WHERE IDCUENTA = 1
Una consideración a tener en cuenta es que el trigger se ejecutará aunque la instruccion DML (UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleted devolveran un conjunto de datos vacio.

    Podemos especificar a que columnas de la tabla debe afectar el trigger.


ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
IF UPDATE(SALDO) -- Solo si se actualiza SALDO
BEGIN
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
END

    Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás.

ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
ROLLBACK
END
    En este caso obtendremos el siguiente mensaje de error:
La transacción terminó en el desencadenador. Se anuló el lote.
    Podemos activar y desactivar Triggers a tarvés de las siguientes instrucciones.


-- Desactiva el trigger TR_CUENTAS
DISABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- activa el trigger TR_CUENTAS
ENABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- Desactiva todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS DISABLE TRIGGER ALL
GO
-- Activa todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS ENABLE TRIGGER ALL

Trigger DDL

    Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.
    La sintaxis general de un trigger es la siguiente.



CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety>
ON DATABASE
FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE>
AS
BEGIN
...
END
    La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de datos. 

33 comentarios:

  1. Muy intersante Ing. con practica podemos reforzar esta teoria porque con sinceridad entiendo poco la programacion en sql pero aspiro y espero entender bien

    ResponderEliminar
  2. me gusta todo lo que esta aqui porque nos esta ayudando a ver como funcionan las instruccion aunq casi no la entiendo pero si es bueno que siempre nos explique con paciencia gracias profe.

    ResponderEliminar
  3. Muy interesante por lo nos permite obtener mas conocimientos y asi aprender sobre todas las funciones de la programacion de SQL.

    ResponderEliminar
  4. Esta muy interesante todo por que por medio de estos codigo tendremos mas occiones para trabajar con tablas y con mas seguridad pero seria mejor que hubiera videos donde muestre como implementarlo en un ejercicio

    ResponderEliminar
  5. Me parece muy importante ya que asi puedo adquirir mas conocimientos y tener opciones para trabajar con las funciones de programacion en sql

    ResponderEliminar
  6. ing.muy interesante pero seria que lo explique con pratica y que sea muy explicativo para asi desmostrar lo aprendido en nuestro medio

    ResponderEliminar
  7. su publicacion esta exelente espero que con la practica entender mas sobre este tema porque no lo entiendo bien gracias.

    ResponderEliminar
  8. para mi el tema esta interesante espero tomar la clase con mucha responsabilidad para adquirir mas conocimiento respecto a lo publicado

    ResponderEliminar
  9. Muy interesante esta para mi el tema por que nos ayudara a trabajar con procedimientos almacenados pero mejor seria si usted lo explica con un ejercicio como lo ha venido haciendo en cada clase por que asi entedemos mucho mejor.

    ResponderEliminar
  10. Bueno el tema esta muy importante porque me enseña a utilizar el codigo de forma eficaz y eficientemente para poder programar y realizar tareas o proyectos de mas magnitudes.

    ResponderEliminar
  11. esta muy bien solo faltaria poner en practica toda la codificacion

    ResponderEliminar
  12. El conocimiento adquirido por un estudiante es fundamental para el exito profesional.
    El tema a tratar es de suma importancia para la programacion en sql ya que asi puedo desarrollar tareas o proyectos mas completos.

    ResponderEliminar
  13. Este temas son de mucha importancia para el conocimiento y formacion profesional en la especialidad de sistemas, espero aprender mas.
    ya que no tengo tantos conicimientos respecto al tema.
    gracias

    ResponderEliminar
  14. La información proporcionada en este blog es de vital importancia, llegando a la conclusión que los triggers son muy parecidos a los procedimientos almacenados, de tal forma que si deseamos ejecutar múltiples acciones cuando un trigger es disparado, podemos encapsular estas acciones dentro de una construcción BEGIN, END. Para concluir se debe tener en cuenta que los triggers tienen un par de palabras clave extra – OLD y NEW – las cuales se refieren respectivamente a los valores de las columnas antes y después de que la sentencia fue procesada.

    ResponderEliminar
  15. Muy interesante este tema por que permite trabajar con procedimientos almacenados, este Triggers en Transact SQL es muy interesante ya que tiene evento en el servidor de bases de datos espero tener mayor conocimiento en su clase

    ResponderEliminar
  16. Los conocimientos adquiridos en este blog es muy importante porque nos ayuda mucho en lo que es programacion en sql, no solo aprendemos los estudiantes sino tambien el docente.

    ResponderEliminar
  17. Todos los dias se aprende cosas nuevas esta pagina esta interesante, ya que asi podemos desarrollar sistemas informaticos que es los que nos interesa en estos momentos.
    gracias.

    ResponderEliminar
  18. Hola Ing. bueno gracias a esta información del blog a usted ha proporcionado y que nos ayuda a resolver nuestras dudas decimos que un triggers es una clase especial de procedimiento almacenado que se ejecuta o dispara en múltiples ocasiones automáticamente cuando se produce un evento en el servidor de bases de datos en el que tenemos dos tipos de triggers el DML que se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML) usando los eventos o instrucciones INSERT, UPDATE o DELETE de una tabla o vista y los DDL que se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL) de los eventos que corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, hay dos palabras claves OLD y NEW que se refieren a los valores de las columnas que son procesados antes y después hay que entender de que se tratan los triggers sabremos que con estas instrucciones podremos crear y administrar tanto la estructura de las tablas para todas las operaciones que hagamos ya sean estas INSER o UPDATE, el DELETE también es una operación de actualización y borrado además hay que tener en cuenta que el triggers se ejecuta aunque las instrucciones DML no hagan ningún efecto en la tabla solo retorna datos vacios son muy comunes y usados con frecuencia tanto en transacciones a diferencia de los DDL que se ejecutan en respuesta a una variedad de eventos tales como CREATE, ALTER o DROP, como los ejecutamos en los procedimientos almacenados dentro de un BEGIN, END.

    Esperando haber comprendido bien el tema estamos predispuestos a seguir aprendiendo más con el objetivo de ser mejores personas y profesionales.

    Jean Carlos Zambrano G.

    ResponderEliminar
  19. es muy interesante ing. vicente romero xq nos ayuda a programar en SQL adquirido por un estudiante es fundamental para el exito profesional.
    ya que este tema permite trabajar con procedimientos almacenados.
    Esperando haber comprendido bien el tema estamos predispuestos a seguir aprendiendo más con el objetivo de ser mejores personas en el futuro.
    que viva el ing.vicente romero

    ResponderEliminar
  20. Me parece un blog muy interesante realizado con la intencion de hacerlo lo mas entendible posible aunque no entiendo del todo las instrucciones todavia estoy seguro que con practica se resolvera todo

    ResponderEliminar
  21. interesante trabajar en sql por que nos permite trabajar con procedimientos almacenados ademas de crear bases de datos ya que con esto nos ayuda a hacer muchas aplicaciones web

    ResponderEliminar
  22. muy bueno ing, es de mucha ayuda sobre todo para loe que estamos viendo sql. felicidades!!!!!!!!!!!

    ResponderEliminar
  23. Es el primer blog que puedo encontrar con las explicación detallando los pasos a seguir con su respectivo sintaxis… y sus respectivos videos excelente espacio… 100 punto

    ResponderEliminar
  24. muy interesante siga poniendo mas de este blog que no permite tener mas conocimiento sobre sql y con esto se no puede facilitar a la hora de resolver un ejercicio.

    ResponderEliminar
  25. los videos que ha subido estan muy interesante que nos ayuda a conocer nuevos metodos para desarrollar aplicaciones

    ResponderEliminar
  26. El tema es bastante interesante ya que aprender a crear Trigger es ser un buen administrador de base de datos al poder controlar las operaciones de INSERT Y DELETE me gustaria que haya ejemplos completos para descargar.

    ResponderEliminar
  27. ESTE TEMA Y LOS VIDEOS ESTAN MUY INTERESANTES YA QUE NOS AYUDA EN EL PROCESO DE APRENDIZAJE DE NUESTRA CARRERA ESTUDIANTIL

    ResponderEliminar
  28. NESTOR CONFORME REYES7 de abril de 2011, 9:48

    Los tiggers es un tema muy importante dentro de lo que es administracion de base de datos que que mediante este podemos crear base de datos mas seguras y eficientes y mediante el uso de los procedimientos almacenados se brinda el uso de los mas importante en el desarrollo y creacion de base de datos, ademas qe los tiggers se ejecutan automaticamente siempre y cuando se produsca un evento dentro del servidor de base de datos, y este nos brinda 2 tipos de tiggers que son DML y DDL el DML intenta modificar datos mediante evenros y el DDL se ejecuta siempres que haya una respuesta a un evento

    ResponderEliminar
  29. ES IMPORTANTE XQ SIRVE PARA LAS PARA PODER ADMINISTRAR LAS BD

    ResponderEliminar
  30. ESTE TEMAS PARA MI ES MUY INTERESANTE POR LO QUE ME PERMITE PODER COMPRENDER UN POCO MAS COMO FUNCIONA SQL UNA PETICION ES QUE SUBA MAS VIDEOS

    ResponderEliminar
  31. ESTE TEMA ES MUY INTERESANTE PORQUE ASI APRENDEMOS COSAS QUE NO SABEMOS Y ASI PODER ENTENDER

    ResponderEliminar