Академический Документы
Профессиональный Документы
Культура Документы
NOTACION:
sp_helptrigger nombre_tabla
Comando para saber si la tabla tiene 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)
sp_helptrigger personal
Ejecutamos el trigger:
Ejecutamos el trigger:
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.
Para estos ejemplos se creara una tabla la cual guardara los datos que queramos que lleve dicho
historial.
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.
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.
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:
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.
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.
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.
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).
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.
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.
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.
Ejecutamos: select * from personal ,observamos que el usuario arquimedes tiene sueldo 200
y eso lo modificaremos.
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
Lo ejecutamos:
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.
open Cursorejemplo
close Cursorejemplo
deallocate Cursorejemplo
3.- Ejercicio con cursores utilizando T-SQL.
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
close Cursorejemplo
deallocate Cursorejemplo
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)
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.
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.