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


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: 27198 Fecha de publicación: 19/09/2007
Pedro Herrarte, es consultor independiente, ofreciendo sercivios 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: 132 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 56 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 172 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 705 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 176 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 618 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista
Visitas: 404 | Comentarios: 0 | Archivo: Articulos
Categorias: Linux|BSD
Visitas: 213 | Comentarios: 0 | Archivo: Articulos
Categorias: Programación|Actualidad
18/08/2008 SQL Server 2008
Visitas: 1029 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 728 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ

Útimos temas recibidos en los foros ...
Crear una sesion de inicio por jhors ... [ASP.NET] 1 06/10/2008
Enviar email a correos cmo hotmail por Cajami ... [C#] 13 06/09/2007
Como mandar mensaje a Celular por Pako ... [C#] 23 13/03/2007
Casting por sara ... [Java] 1 06/10/2008
ORA-22288: file or LOB operation GetLength failed por heroga ... [ORACLE] 1 05/08/2008
Galeria de imagenes en Visual Web Developer por luis ... [ASP.NET] 0 06/10/2008
utilizar un ObjectDataSource por mari90 ... [ASP.NET] 4 25/10/2006
Llamar procedimientos almacenados por elmago ... [C#] 1 04/10/2008
Procesos huerfanos por cesarf283 ... [SQL Server] 2 11/07/2007
numero autogenerado por lucho ... [Visual Basic .NET] 17 10/01/2007
PUNTO DE VENTA por TIBURON ... [Access] 0 04/10/2008
Curso Visual Basic .NET en vídeo por martaz ... [Visual Basic .NET] 4 08/11/2007

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 ...
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
20/03/2008 Funciones integradas de Transact SQL (I)    forma parte de...Tutorial de Transact SQL
24/05/2006 Cursores Implicitos en PL/SQL    forma parte de...Tutorial PL/SQL
28/06/2006 Propagacion de excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
26/07/2006 PL/SQL y Java    forma parte de...Tutorial PL/SQL
17/10/2006 Excepciones personalizadas en PL/SQL    forma parte de...Tutorial PL/SQL
10/06/2007 Multiples escritorios en Windows XP
19/09/2007 Triggers en Transact SQL    forma parte de...Tutorial de Transact SQL
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
19/10/2005 Configurar el IIS para ejecutar aplicaciones ASP.net

 

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