InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial de Transact SQL
Introducción a Transact SQL
Programación con Transact SQL
Fundamentos de Transact SQL
Tipos de datos en Transact SQL
Variables en Transact SQL
Equivalencia de datos de SQL Server y .NET
Operadores en Transact SQL
Estructuras de control en Transact SQL
Control de errores en Transact SQL
Consultar datos en Transact SQL
Consultas agregadas
Select FOR XML
Operaciones con conjuntos.
Insertar datos en Transact SQL
Actualizar datos en Transact SQL
Borrar datos en Transact SQL
Transacciones en Transact SQL
Procedimientos almacenados en Transact SQL
Funciones en Transact SQL
Funciones integradas de Transact SQL (I)
Triggers en Transact SQL
Cursores en Transact SQL
SQL dinámico en Transact SQL
También puedes ver ...
SET IDENTITY_INSERT ON y LinqToSQL
SQL Server 2008
LinQ To SQL - Un ejemplo sencillo
Formatear números en SQL Server
Leer un campo XML de SQL Server 2005 con C#
SQL dinámico en Transact SQL
Cursores en Transact SQL
Funciones en Transact SQL
Procedimientos almacenados en Transact SQL
Transacciones en Transact SQL

Afiliados
La Web del programador
MundoProgramacion


 

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 inserteddeleted. 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_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

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. 


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

 


Inicio | Tutorial de Transact SQL Funciones integradas de Transact SQL (I)Tutorial de Transact SQLCursores en Transact SQL Versión para imprimir Foros de consulta

 
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
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial de Transact SQL Funciones integradas de Transact SQL (I)Tutorial de Transact SQLCursores en Transact SQL Versión para imprimir

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
Categorias: ASP.NET
Visitas: 34 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 285 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Basic .NET|C#
Visitas: 842 | Comentarios: 2 | Archivo: Articulos
Categorias: C#|ASP.NET|HTML DHTML|XML|JavaScript|ASP.NET|ASP|PHP|Visual Studio
Visitas: 712 | Comentarios: 1 | Archivo: Articulos
Categorias: Administración|Tutorial SQL
Visitas: 451 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 1054 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 250 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS

Útimos temas recibidos en los foros ...
autogenerado de sugero social de salud por noemi ... [Visual Basic .NET] 15 29/06/2008
FORMULARIO ACCESS por jcifuentes ... [Access] 11 29/05/2007
Ysmael por Ysmael ... [SQL] 0 08/01/2009
Reflection por Maurito22 ... [C#] 2 06/01/2009
Programador por Robert ... [ORACLE] 0 07/01/2009
como insertar registros en un formulario de visual basic.net desde la base de datos sql server por orlan ... [SQL Server] 8 09/06/2008
quierocodigo de autogenerado del seguro por edwin garcia ramirez ... [Visual Basic .NET] 0 07/01/2009
Video gratis sobre AJAX con ASP.NET por alexxe ... [ASP.NET] 1 06/01/2009
calcular saldo acumulativo por cben ... [SQL] 5 30/12/2008
comparar 2 campos de 2 tablas usando el like por nani ... [SQL Server] 1 06/01/2009
Apagar ordenador remoto en C# por victoryiyo ... [C#] 1 07/01/2009
numero de AUTOGENERADO IPSS por carlos ... [Visual Basic .NET] 5 30/10/2008

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
22/10/2005 Consultas combinadas. JOINS    forma parte de...Tutorial SQL
01/07/2008 LinQ To SQL - Un ejemplo sencillo
28/06/2006 Propagacion de excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
02/08/2007 Como desactivar el botón derecho del ratón en una Web para evitar descargar imagenes
31/03/2006 Tipos de datos en PL/SQL    forma parte de...Tutorial PL/SQL
21/02/2007 Subconsultas    forma parte de...Tutorial SQL
03/10/2006 Polimorfismo    forma parte de...Tutorial C#
28/06/2006 Excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
28/06/2006 Triggers en PL/SQL    forma parte de...Tutorial PL/SQL

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]