Trigers

27/01/2007 - 16:08 por SergioT | Informe spam
Hola

Estoy queriendo aprender a utilizar trigers y tengo mi primer caso , haber
si me pueden decir como hacerlo y de paso pasarme algunas referencias
rapidas para aprender a manejar trigers

Tengo las tablas
Grupo(idGrupo,nombreGrupo,idEncargado)
Empleado(idEmpleado,nombre., idGrupo,idEncargado)

donde empleado.idGrupo es el grupo al que pertenece el empleado y
empleado.idEncargado es el encargado del grupo, aunque es una columna
redundante la incorporé por tema de velocidad en las consultas y por el alto
uso que hare de la tabla empleado

La cuestion es que uando cambien Grupo.IdEncargado quiero disparar una
consulta de actualizacion a todos los registros que tienen el grupo al cual
se le esta cambiando el encargado y actualizarles el id del nuevo encargado.
Esto lo puedo lograr con una consulta de actualizacion en el SP que hace
update de la tabla grupo pero no quiero hacerlo así , quiero usar un triger
para ir conociendo el tema y por que por ahi si regero el SP de update de la
tyabla grupo por ahi y pierdo la logica de actualizacion de la tabla
Empleado

gracias por la ayuda
sergio
 

Leer las respuestas

#1 Alejandro Mesa
27/01/2007 - 19:09 | Informe spam
Sergio,

Como ejercicio para aprender a programar los triggers esta bien, pero es
preferible que esto lo hagas atraves de un procedimiento puesto que los
triggers, aunque utiles, tienden a alargar la transaccion, pueden ser
desabilitados, no se disparan automaticamente cuando hacemos insercion en
masa, tampoco se disparan cuando hacemos un "truncate" de la tabla, y para
aumentar uno mas, los resultados pueden ser los no esperados cuando usamos la
nueva utilidad de "snapshot isolation".

Avoid These Common Business Rule Implementation Mistakes
http://www.devx.com/dbzone/Article/31985/0

create trigger tr_grupo_upd on dbo.Grupo
for update
as
if update(idEncargado)
begin
update e
set e.idEncargado = i.idEncargado
from dbo.Empleado as e inner join inserted as i
on e.idGrupo = i.idGrupo

if @@error != 0
begin
raiserror('Error actualizando tabla Empleado.', 16, 1)
end

end
go

Debes tener en cuenta que al denormalizar la tabla Empleado, de alguna forma
debes garantizar que el valor de la columna [idEncargado] sea igual al valor
de la columna [idEncargado] del grupo al que pertenecen en la tabla [Grupo].
Deja poner un ejemplo de lo que trato de decir.

update dbo.Empleado
set idEncargado = 123
where idGrupo = 345
go

De alguna manera debes garantizar que el empleado 123 es el encargado del
grupo 345 en la tabla [Grupo], de lo contrario se rompe la integridad de tu
base de datos. Este es uno de los problemas que genera la denormalizacion.


AMB

"SergioT" wrote:

Hola

Estoy queriendo aprender a utilizar trigers y tengo mi primer caso , haber
si me pueden decir como hacerlo y de paso pasarme algunas referencias
rapidas para aprender a manejar trigers

Tengo las tablas
Grupo(idGrupo,nombreGrupo,idEncargado)
Empleado(idEmpleado,nombre., idGrupo,idEncargado)

donde empleado.idGrupo es el grupo al que pertenece el empleado y
empleado.idEncargado es el encargado del grupo, aunque es una columna
redundante la incorporé por tema de velocidad en las consultas y por el alto
uso que hare de la tabla empleado

La cuestion es que uando cambien Grupo.IdEncargado quiero disparar una
consulta de actualizacion a todos los registros que tienen el grupo al cual
se le esta cambiando el encargado y actualizarles el id del nuevo encargado.
Esto lo puedo lograr con una consulta de actualizacion en el SP que hace
update de la tabla grupo pero no quiero hacerlo así , quiero usar un triger
para ir conociendo el tema y por que por ahi si regero el SP de update de la
tyabla grupo por ahi y pierdo la logica de actualizacion de la tabla
Empleado

gracias por la ayuda
sergio



Preguntas similares