Вы находитесь на странице: 1из 16

TRIGGER EN SQL SERVER (DISPARADOR)

Un disparador es una clase especial de procedimiento almacenado que se ejecuta


automáticamente cuando se produce un evento en el servidor de bases de datos. Los
disparadores 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.
Estos desencadenadores se activan cuando se desencadena cualquier evento válido, con
independencia de que las filas de la tabla se vean o no afectadas.
Sirve como para el caso de auditoria, es decir cambios que se han hecho en la base de datos
basándose en los historiales de los triggers.

NOTACION:

create trigger nombre_trigger


on nombre_tabla
for | after | instead of
insert | update | delete
as
begin
“insertamos lo que deseemos que realice el trigger”
end

 for | after | instead of


Elegimos en que momento cuando se esté realizando alguna ACCION (insert,
update,delete) se quiere activar el trigger.
 for: significa que se activara en el momento que se realice el trigger.
 after: significa que se espera a que se realice el la acción para poder iniciar la
operación del trigger
 Instead of: significa que el trigger se realizara en vez de la acción, es decir, no
cambiara nada en la tabla.

 insert | update | delete


Elegimos en que ACCION queremos que se active el trigger.
 insert: se utiliza para insertar registros en la tabla
 update: se utiliza para modificar registros en la tabla
 delete se utiliza para borrar registros en la tabla

 sp_helptrigger nombre_tabla
Comando para saber si la tabla tiene trigger

 drop trigger nombre_tabla


Comando para borrar trigger

La tabla personal se utilizó para los ejemplos a continuación:

create table personal (


Enombre char(15) not null primary key,
Cargo char(10) not null,
Esueldo integer not null,
Dept char(4)
);
insert into personal values('LUCAS','EVANG1',53,'THEO');
insert into personal values('MARCOS','EVANG2',52,'THEO');
insert into personal values('MATEO','EVANG3',51,'THEO');
insert into personal values('DICK NIX','LADRON',25001,'PHIL');
insert into personal values('HANK KISS','BUFON',25000,'PHIL');
insert into personal values('JUAN','EVANG4',54,'THEO');
insert into personal values('EUCLIDES','AYTE. LAB.',1000,'MATH');
insert into personal values('ARQUIMEDES','AYTE. LAB.',200,'ENG');
insert into personal values('DA VINCI','AYTE. LAB.',500,'');

EJERCICIOS INICIALES PARA ENTENDER EL FUNCIONAMIENTO DEL TRIGGER

1.- Ejecutamos el trigger que obtendrá los datos de la tabla personal con for insert (en este
caso se activara el trigger en el momento que se haga un insert en la tabla personal)

create trigger personal_insert


on personal
for insert
as
print 'hubo un cambio en la tabla personal' –-mensaje que aparecerá cuando se
haga un INSERT en la tabla PERSONAL

Verificamos que se creó el trigger:

sp_helptrigger personal

Ejecutamos el insert y observamos que aparecen los 2 mensajes:

insert into personal values ('alexander','manager',500,'eng')

Y verificamos que se insertó el registro:


2.- Realizamos el mismo ejercicio anterior con la misma tabla pero con after update (en este caso
se activara el trigger después que se haga un update en la tabla personal)
Cambiamos el nombre del nuevo trigger sino dará error ya que se tendría un trigger con el mismo
nombre.

Ejecutamos el trigger:

create trigger personal_update


on personal
after update
as
print 'hubo una modificacion en la tabla personal' –-mensaje que aparecerá cuando
se haga un UPDATE en la tabla PERSONAL

Verificamos que se creó el trigger: sp_helptrigger personal

Ejecutamos: select * from personal , y modificaremos el sueldo de alexander.

Ejecutamos el update y observamos que aparecen los 2 mensajes:

update personal set esueldo=1000


where enombre='alexander'

Y verificamos que se modificó el registro:


3.- Realizamos el mimos ejercicio anterior con la misma tabla pero con instead of delete (en este
caso se realizara el trigger EN VEZ DE el delete, por lo que no se eliminara el registro).
Cambiamos el nombre del nuevo trigger sino dara error ya que se tendría un trigger con el mismo
nombre.

Ejecutamos el trigger:

create trigger personal_delete


on personal
instead of delete
as
print 'se quiere eliminar datos de tabla personal' –-mensaje que aparecerá cuando
se haga un INSERT en la tabla PERSONAL

Verificamos que se creó el trigger:

Realizamos: select * from personal , y eliminaremos el registro con nombre alexander.

Ejecutamos el delete y observamos que aparecen los 2 mensajes:

Realizamos select * from personal , y vamos a ver que no se eliminó el registro porque en
el trigger utilizamos instead of.
Estos ejercicios muestran el funcionamiento del trigger, mas no son para que muestren
mensajes como se vino haciendo.

CREAR UN LOG USANDO TRIGGER

A continuación se creara un historial de las acciones (insert,update,delete) que se puede realizar


en una tabla, utilizando trigger.

Para estos ejemplos se creara una tabla la cual guardara los datos que queramos que lleve dicho
historial.

CREATE TABLE log_historial (


nombre nvarchar(20) not null,
fecha date not null,
descripcion nvarchar(50) not null,
)

1.- Se realizara un insert con cualquiera de las opciones for, after o intead of. Y se mostrara la
estructura del trigger como debe ser escrita.

Ejecutamos el trigger:
Como se puede observar la estructura es similar hasta la parte donde comienza el begin y termina
en el end. Esta parte lo que quiere decir es que al momento de realizar alguna acción en la tabla
personal, el atributo enombre, la fecha y algún mensaje que se quiera escribir se insertaran en la
tabla log_historial que tiene los atributos nombre, fecha, descripción; y como consiguiente se
escribe from inserted.
La tabla inserted es una tabla temporal que se crea al momento que se realiza un insert con
todos los atributos de la tabla original a la cual se realizó dicho insert; por lo que el trigger se
basara en esta tabla inserted para tomar dichos atributos y realizar su respectiva operación.

create trigger personal_insert


on personal
for insert
as
begin
insert into log_historial(nombre,fecha,descripcion)
select Enombre,getdate(),'se insertaron datos en la tabla'
from inserted
end

Se puede verificar si el trigger se creó con el comando: sp_helptrigger nombre_tabla

Ejecutamos el insert y como se puede observar nos muestra 2 mensajes sobre filas afectadas, los
cuales, uno pertenece a la tabla personal en donde se insertó el registro y el otro se refiere al
registro que se insertó en la tabla log_historial.

insert into personal values ('freddy','bufon',500,'eng')


Realizamos: select * from log_historial , y se observa que se insertó un registro que lleva
el nombre del atributo que se insertó, la fecha y el mensaje.

2.- Como este historial se lo pude realizar como para un trabajo de auditoria entonces no se desea
que el otro mensaje de fila afectada que se refiere al registro insertado en la tabla log_historial
se muestre al ejecutar alguna acción en la tabla; por lo que ahora se realizara el mismo ejercicio
anterior pero se insertara set nocount on en el trigger de la siguiente manera:

create trigger personal_insert2


on personal
for insert
as
begin
set nocount on
insert into log_historial(nombre,fecha,descripcion)
select Enombre,getdate(),'se insertaron datos en la tabla'
from inserted
end

Ejecutamos el insert y como se puede observar ahora únicamente muestra el mensaje de las filas
afectadas, que se refiere al registro insertado en la tabla personal.

insert into personal values ('alexander','ayt',800,'eng')

Realizamos: select * from log_historial , y se observa que se insertó un nuevo registro que
lleva el nombre del atributo que se insertó, la fecha y el mensaje.

3.- Ahora se realizara un trigger para mostrar la nomenclatura que se debe seguir para borrar
registros de una tabla.

Ejecutamos el trigger y como se puede observar es similar a la nomenclatura del anterior trigger
pero con diferencia que para hacer un delete en este caso, el trigger se basara de la tabla temporal
deleted para realizar su operación.
La tabla deleted es una tabla temporal que se crea al momento que se realiza un delete con
todos los atributos de la tabla original a la cual se realizó dicho delete; por lo que el trigger se
basara en esta tabla deleted para tomar dichos atributos y realizar su respectiva operación.

Para este ejemplo se escogió instead of.


create trigger personal_delete
on personal
instead of delete
as
begin
set nocount on
insert into log_historial(nombre,fecha,descripcion)
select Enombre,getdate(),'se han eliminado datos en la tabla'
from deleted
end

Ejecutamos el delete y como se puede observar únicamente se muestra el mensaje de las filas
afectadas, que se refiere al registro eliminado en la tabla personal, ya que en el trigger se insertó
set nocount on.
En realidad no se eliminó este registro ya que utilizamos instead of, lo que no permite que se
elimine el registro pero añadirá la información en la tabla log_historial.

delete from personal where enombre='arquimedes'

Realizamos: select * from log_historial , y se observa que se insertó el registro que lleva el
nombre del atributo que se quiso eliminar, la fecha y el mensaje.

4.- Ahora se realizara un trigger para que muestre en la tabla log_historial registros donde
aparezca el nombre del usuario que realizo la acción (insert,update,delete).

Ejecutamos el trigger y como se puede observar es similar a la nomenclatura de los trigger


anteriores pero la única diferencia es que en vez del atributo enombre vamos a querer que
aparezca el usuario, ingresando la palabra user.
Para este ejemplo se escogió instead of.

create trigger personal_delete


on personal
instead of delete
as
begin
set nocount on
insert into log_historial(nombre,fecha,descripcion)
select user,getdate(),'se han eliminado datos en la tabla'
from deleted
end
Ejecutamos: delete from personal where enombre ='arquimedes'

Realizamos: select * from log_historial , y se observa que se insertó el registro que lleva el
nombre del usuario (dbo) que realizo el delete, la fecha y el mensaje.

5.- Ahora se realizara un trigger para que envié los datos Insertados, Eliminados, Modificados (es
decir las acciones que se ejecuten en una tabla), a otra tabla que crearemos a continuación.

CREATE TABLE personal2(


Enombre char(15) NOT NULL,
Cargo char(10) NOT NULL,
Esueldo int NOT NULL,
Dept char(4) NULL
)

Para verificar si se creó la tabla podemos ejecutar: select * from personal2

Ejecutamos el trigger y como podemos observar dentro del begin y end, tenemos una nueva
instrucción que significa que al momento de realizar el delete en la tabla personal, el trigger se
basara de la tabla temporal deleted para obtener los datos y estos datos se insertaran en la tabla
personal2.
Y obviamente el registro se eliminara de la tabla personal ya que para este ejemplo se está
utilizando for.

create trigger personal_delete


on personal
for delete
as
begin
set nocount on
insert into personal2
select * from deleted
end

Ejecutamos: delete from personal where enombre ='alexander’


Ejecutamos: select * from personal y select * from personal2 , se podrá observar que en
la tabla personal se eliminó el registro y que en la tabla personal2 se insertó el registro que se
eliminó en la tabla personal.

6.- Ahora se realizara un trigger para mostrar la acción del update.

Ejecutamos el trigger y como se puede observar sigue la misma estructura de los trigger que se
ha realizo pero con diferencia que para el update se utilizara la tabla temporal inserted.
Para este ejemplo se utilizara after.

create trigger personal_update


on personal
after update
as
begin
insert into log_historial(nombre,fecha,descripcion)
select Enombre,getdate(),'se han modificado datos en la tabla'
from inserted
end

Ejecutamos: select * from personal ,observamos que el usuario arquimedes tiene sueldo 200
y eso lo modificaremos.

Ejecutamos: update personal set esueldo=1000 where enombre='arquimedes'


Como se muestra obtendremos como resultado 2 mensajes ya que en el trigger no se inserto set
nocount on.
Ejecutamos: select * from log_historial y select * from personal , observamos que se
añadió el registro en la tabla log_historial y se modificó la tabla personal.

CURSORES EN SQL SERVER

 En SQL Server un cursor puede definirse como un elemento que representará a un


conjunto de datos determinado por una consulta T-SQL.
 El cursor permitirá recorrer fila a fila, leer y eventualmente modificar dicho conjunto de
resultados.
 Un cursor es una variable que nos permite recorrer con un conjunto de resultados
obtenidos a través de una sentencia SELECT fila a fila.

Cuando trabajemos con cursores debemos seguir los siguientes pasos.

 Declarar el cursor, utilizando DECLARE


 Abrir el cursor, utilizando OPEN
 Leer los datos del cursor, utilizando FETCH ... INTO
 Cerrar el cursor, utilizando CLOSE
 Liberar el cursor, utilizando DEALLOCATE

1.- Ejercicio para entender el funcionamiento del Cursor.

 Declaramos el cursor con la tabla que deseamos utilizar:


declare Cursorejemplo Cursor
for select * from personal

 Abrimos el cursor:
open Cursorejemplo

 Aquí lo que indicamos es que vaya al siguiente registro que está en el Cursorejemplo y
se va a desplazar uno por uno al ejecutarlo varias veces.
fetch next from Cursorejemplo

 Cerramos el cursor:
close Cursorejemplo

 Se libera la memoria del cursor que se está utilizando.


deallocate Cursorejemplo

Lo ejecutamos:

declare Cursorejemplo Cursor


for select * from personal
open Cursorejemplo
fetch next from Cursorejemplo

fetch next from Cursorejemplo

Así se puede ir ejecutando fetch next from Cursorejemplo , el cual recorrerá uno por uno los
registro que tiene la tabla personal hasta llegar al siguiente resultado donde ya no aparecerá
ningún registro lo que nos indica que ya ha recorrido todos los registros.

close Cursorejemplo

deallocate Cursorejemplo

2.- También se puede añadir la palabra scroll al momento de declarar el cursor para después
indicarle al cursor que registro deseamos ver si el siguiente, el anterior, el primero o el último
registro.

fetch next | fetch prior | fetch first | fetch last

declare Cursorejemplo Cursor scroll


for select * from personal

open Cursorejemplo

fetch next from Cursorejemplo


--fetch prior from Cursorejemplo
--fetch first from Cursorejemplo
--fetch last from Cursorejemplo

close Cursorejemplo

deallocate Cursorejemplo
3.- Ejercicio con cursores utilizando T-SQL.

Utilizaremos la tabla personal para este ejemplo.


Declaramos variables guiándonos de los nombres de los atributos de la tabla personal (los
nombre de las variables pueden no escribirse de la misma forma que se encuentra en la tabla
personal).

declare @nombre nvarchar(20)


declare @cargo nvarchar(20)
declare @sueldo nvarchar(20)
declare @departamento nvarchar(20)

declare Cursorejemplo Cursor


for select * from personal

open Cursorejemplo

Lo que realiza esta instrucción es que al momento que se hace el select, el contenido se ingresara
en las variables anteriormente declaradas.
fetch next from Cursorejemplo into @nombre,@cargo,@sueldo,@departamento

Esta instrucción mostrara el contenido de cada uno de los registros que se encuentran en la tabla
personal.
El fetch_status indica que mientras esté en 0 puede continuar ya que cuando este valor sea 1,
será cuando ya se haya recorrido todos los registros de la tabla.

while(@@FETCH_STATUS=0)
begin
print @nombre+''+@cargo+' '+@sueldo+' '+@departamento

fetch next from Cursorejemplo into @nombre,@cargo,@sueldo,@departamento


end

close Cursorejemplo

deallocate Cursorejemplo

Se puede ejecutar todo directamente y como resultado obtendremos un select de la tabla


personal, pero sin los nombres de los atributos como encabezado.
4.- Ahora haremos el insert de todos los datos de una tabla a otra tabla que crearemos a
continuación.
Se puede también crear la tabla únicamente con los datos que deseamos que se inserte en esta
nueva tabla.

create table personal3 (


Enombre char(15) not null,
Cargo char(10) not null,
Esueldo integer not null,
Dept char(4)
);

Verificamos que se creó la tabla personal3 y observamos que lógicamente no tendrá datos:

Declaramos las variables que vamos a utilizar para insertar los datos en la nueva tabla. En este
caso declaramos todas las variables que corresponden a cada uno de los atributos de la tabla
personal.
declare @nombre nvarchar(20)
declare @cargo nvarchar(20)
declare @sueldo nvarchar(20)
declare @departamento nvarchar(20)

declare Cursorejemplo Cursor


for select * from personal

open Cursorejemplo

Lo que realiza esta instrucción es que al momento que se hace el select, el contenido se ingresara
en las variables anteriormente declaradas.
fetch next from Cursorejemplo into @nombre,@cargo,@sueldo,@departamento

Esta instrucción es la que insertara los registros de la tabla personal a la tabla personal3.

while(@@FETCH_STATUS=0)
begin
insert into personal3 values (@nombre,@cargo,@sueldo,@departamento)
fetch next from Cursorejemplo into @nombre,@cargo,@sueldo,@departamento
end

close Cursorejemplo

deallocate Cursorejemplo
Se puede ejecutar todo directamente y observaremos que da como resultado mensajes de filas
afectadas, las cuales deben ser 9 filas afectadas que representan los registros insertados en la
tabla personal3.

Ejecutamos: select * from personal3 , y se mostrara los registros insertados.

5.- Ahora haremos un update en la tabla personal3.


Entonces modificaremos el sueldo de la persona con nombre arquimedes para que sea de 400.

Ejecutamos: select * from personal3 , y observamos que el sueldo es de 1000


Se puede ejecutar todo directamente y observaremos que da como resultado mensajes de filas
afectadas, las cuales deben ser 9 filas afectadas ya que el cursor recorre cada uno de los registros
de la tabla personal3 y una de esas filas afectadas corresponde a la modificación que se realizó.

Ejecutamos: select * from personal3 , y observamos que el sueldo es de 400.

NOTA:

En si para esto es lo que sirve el cursor, para que mientras leemos los registros de una tabla uno
por uno, se pueda ejecutar alguna función como se realizó anteriormente como fue el select,
Insert o update.

Вам также может понравиться