 |
|
 |
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 hereEND
|
Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted.
Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deleted es 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_CUENTASON CUENTASAFTER UPDATEAS 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
END |
La siguiente instrucción provocará que el trigger se ejecute:
UPDATE CUENTASSET SALDO = SALDO + 10WHERE 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_CUENTASON CUENTASAFTER UPDATEAS 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 SALDOBEGIN 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_CUENTASON CUENTASAFTER UPDATEAS 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 CUENTASGO -- activa el trigger TR_CUENTAS ENABLE TRIGGER TR_CUENTAS ON CUENTASGO -- Desactiva todos los trigger de la tabla CUENTAS ALTER TABLE CUENTAS DISABLE TRIGGER ALLGO -- 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.
CREATE TRIGGER TR_SEGURIDAD ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGIN RAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1)ROLLBACK TRANSACTION
END |
|
| |
 |
Muy Buena Informacion
por
Christian
Respuesta recibida el [14/03/2008 05:25:00]
|
 |
Hola como estas solo keria decirte que tu trabajo es muy bueno y q me sirvio de mucho, resolvi muchas de mis dudas.
|
| |
 |
MUY BIEN
por
ESTEBAN
Respuesta recibida el [26/03/2008 07:07:10]
|
 |
Esta muuy toda esta informacion que tienes me saco de varias dudas. Tambien me gustaria que combinaras Triggers y Cursores eso esta estaria mucho mejor
|
| |
 |
3158488742
por
lesly
Respuesta recibida el [02/04/2008 08:48:57]
|
 |
como hago para crear un tipo de dato AUTO NUMERICO EN SQL SERVER 2005
|
| |
 |
Gracias
por
Favio
Respuesta recibida el [09/04/2008 09:56:53]
|
 |
Seguí así
|
| |
 |
impecable
por
romamuy
Respuesta recibida el [20/05/2008 02:41:42]
|
 |
me ayudo pila gracias
ojala los tutoriales q encuentro fueran tan claros xD
saludos
|
| |
 |
Me gusto, pero...
por
Ale
Respuesta recibida el [29/05/2008 08:59:38]
|
 |
Esta muy bien explicado pero me gustaria que agregaran mas cosas sobre triggers y como combinarlos con procedimientos almacenados....
|
| |
 |
Muy Bien
por
Johnfer
Respuesta recibida el [30/05/2008 11:15:16]
|
 |
La explicación es Excelente, gracias, desearía saber como se puede hacer los Trigger con la utilización de varias tablas y como combinarlos con procedimientos
|
| |
 |
Excelente =)
por
BrAuLio
Respuesta recibida el [06/06/2008 04:02:08]
|
 |
Solo queria comentar que gracias a esto resolvi grandes dudas a resolver os agradesco gracias.
|
| |
 |
Felicidades
por
cristhian
Respuesta recibida el [08/06/2008 11:18:00]
|
 |
Tienes muy buenos conocientos
|
| |
 |
Muchas gracias
por
Aterelo
Respuesta recibida el [09/06/2008 04:27:48]
|
 |
Es grato encontrar informacion que realmente ayuda, pues en muchos sitios explican y explican 20 mil cosas y uno termina por no entender nada. Muy buena informacion, clara y al grano.
|
| |
 |
Replica de BD - SQL 2005
por
Emerson
Respuesta recibida el [10/06/2008 03:52:50]
|
 |
hola amigo, a todos tengo un tarea en el lugar que estudio el cual es Replica de Base de Datos SQL Server Management Studio 2005, y la verdad no se a que se refiere con eso estube buscando informacion per nada entendi, el trabajo que me dejo el profesor es la implementacion de replica de base de datos obviamente sql. si tu o alguien tiene algun archivo o tutorial que me permita lograr esto le estare muy agradecido mi correo es rebraqui@gmail.com. gracias
|
| |
 |
Gracias
por
Pedro Hernandez (mx)
Respuesta recibida el [17/09/2008 10:50:36]
|
 |
gracias por tu publicación, me ha servido bastante, he aclarado varias dudas acerca de los triggers. Sigue asi.
|
| |
 |
buen trabajo
por
rodrigo lara
Respuesta recibida el [02/10/2008 01:28:35]
|
 |
gracias!, me sirvio de mucho tu ayuda, sique asi.
|
| |
 |
Excelente
por
Eidem
Respuesta recibida el [13/10/2008 04:09:15]
|
 |
Excelente Mi Buen.
Claro y Conciso... Te sacaste un 10 con este tutorial. Gracias !!!
|
| |
 |
Gracias
por
Karlos
Respuesta recibida el [14/10/2008 09:23:19]
|
 |
muy buen minitutorial sobre el manejo de desencadenantes en SQLServer.
|
| |
 |
como se modifica un trigger y ...
por
Anónimo
Respuesta recibida el [17/10/2008 12:19:24]
|
 |
como se modifica un trigger y que agregue despues de un insert y update haga un select en una tabla
|
| |
 |
Trigger para formar Llave
por
antonio de Guatemala
Respuesta recibida el [29/10/2008 05:39:39]
|
 |
Rapidamente, necesito crear una llave con 2 campos, anio y un correlativo por año, si fuera 2008+00025, queraria 200800025, el 25 es un numero que deberia incrementarse por año.
La verdad no se si se hace en triger o se hace en otra parte, espero tener un camino por donde tomar.
|
| |
 |
Triggers
por
JP
Respuesta recibida el [05/11/2008 01:30:16]
|
 |
Está todo barbaro, pero cuales son las variables que tengo para manipular la tupla que agregué o borré de la tabla.
Ej. en Oracle tengo :new y :old... cuales son los equivalentes aca??
|
| |
 |
RE:Triggers por JP
por
TOXIKO
Respuesta recibida el [06/11/2008 12:15:31]
|
 |
"NEW" HACE REFERENCIA A LA TABLA NUEVA, LO QUE EN T-SQL VENDRIA A SER "INSERTED". "OLD" HACE REFERENCIA A LA TABLA ANTES DE SER MODIFICADA O BORRADA, LO QUE EN T-SQL VENDRIA A SER "DELETED".
|
| |
 |
se agradese
por
marciano_l
Respuesta recibida el [19/11/2008 10:53:33]
|
 |
es muy buena la pagina me oarece que es la mejor que encontre sobre el tema te detalle todo lo necesario para cada consulta, compadre sique asi.
|
| |
 |
Muy Claro el mini Tutorial
por
EDITH
Respuesta recibida el [03/12/2008 07:58:44]
|
 |
En verdad exelente lo tuyo,e me aclararon muchas dudas.Thank you
|
| |
 |
Excelente
por
Vicent
Respuesta recibida el [18/12/2008 11:55:32]
|
 |
Esta muy bueno, esta info. sobre los TRIGGER, ahora lo que yo nesecito saber es, se puede obteber la info. que se va a modificar y la que info. nueva. es para una bitacora...
|
| Añadir comentario ... |
Para preguntar utiliza los foros
|
|

|
Triggers en Transact SQL |
|
Autor:
Pedro Herrarte Sánchez
|
|
Visitas:
35709 |
Fecha de publicación:
19/09/2007 |
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.
Posee mas de diez años de experiencia trabajando para las principales empresas de España.
Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.
Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).
Es fundador, diseñador y programador de www.devjoker.com. |
|
|
Visitas:
45
|
Comentarios:
0
|
Archivo:
Articulos
|
|
Visitas:
109
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
156
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
34
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
285
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
842
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
712
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
451
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
1054
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
250
|
Comentarios:
0
|
Archivo:
Articulos
|
|
|
|
 |
| Encuesta |
|
¿A que perfil te adaptas mejor? |
|
|
|
|
|
|
|
|
 |