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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Hernan Nieto
29/01/2007 - 13:35 | Informe spam
Alejandro,

Con referencia a tu respuesta sobre el uso de procedimientos en lugar
de triggers, me sorprende que indiques lo anterior. Tenia entendido que
eran ideales para actualizaciones automaticas, como por ejemplo tablas
de auditoria. En el caso de usar procedimientos, se perderia la
actualizacion automatica por parte del Gestor de BD, tendriamos q
ejecutarlos dentro del codigo de programacion, es asi?. Podrias, por
favor, aclararme un poco mas el tema.

Desde ya, muchas gracias.

Saludos



Mesa avait prétendu :
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



Respuesta Responder a este mensaje
#3 SergioT
29/01/2007 - 14:43 | Informe spam
Hola
Gracias por tu codigo es muy ilustrativo lo probare en seguida, por tus
comentarios me parece que el uso de trigers no es bueno para actualizaciones
automaticas , yo pensaba que ese era el ideal para trigers, automatizar
actualizaciones, pero si no es ese su mejor uso , para que sirven o en que
es bueno utilizarlos?

Salu2
Sergio

"Alejandro Mesa" escribió en el
mensaje news:
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



Respuesta Responder a este mensaje
#4 Alejandro Mesa
29/01/2007 - 15:33 | Informe spam
Hernan Nieto,

Ideales no creo, pero utiles en cierta forma si. No ideales porque la forma
en que se implementan las tablas "deleted" e inserted" en 2000 es mediante
vistas que apuntan al log de transacciones. Las transacciones se graban de
forma sequencial, a medida que ocurren las modificaciones y leer estas tablas
hace que tengamos que regresar a leer esa data, ademas de que esas vistas o
tablas virtuales no estan indisadas, asi que la lectura se hara mediante un
scan de las mismas.

Si la regla de negocio se puede llevar a cabo mediante integridad
referencial, entonces hacerlo, de lo contrario ver si se puede hacer via
procedimiento almacenado. Si esto no es posible, pues entonces hacerlo
mediante trigger.

Como esquema de seguridad, muchas veces se niega la manipulacion directa de
las tablas "insert, update, delete" y solo se permite atrvas de
procedimientos, osea la interfaz de comunicacion con nuestra base de datos se
hara mediante el uso de los procedimientos.


AMB

"Hernan Nieto" wrote:

Alejandro,

Con referencia a tu respuesta sobre el uso de procedimientos en lugar
de triggers, me sorprende que indiques lo anterior. Tenia entendido que
eran ideales para actualizaciones automaticas, como por ejemplo tablas
de auditoria. En el caso de usar procedimientos, se perderia la
actualizacion automatica por parte del Gestor de BD, tendriamos q
ejecutarlos dentro del codigo de programacion, es asi?. Podrias, por
favor, aclararme un poco mas el tema.

Desde ya, muchas gracias.

Saludos



Mesa avait prétendu :
> 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
>>
>>
>>



Respuesta Responder a este mensaje
#5 Alejandro Mesa
29/01/2007 - 15:38 | Informe spam
Sergio,

Como en todo lo que nos rodea en la vida cotidiana, no hay algo perfecto que
cubra todas nuestras necesidades. Tu debes evaluar las herramientas con las
que cuentas y usarlas de forma que satisfagan tus necesidades.

Puedes usarlos para enforzar integridad referencial entre tablas de
diferentes bases de datos, para auditoria, para actualizacion de otras
columnas en la misma tabla y/o otras tablas, etc. Mi punto es que depende de
tu esquema de seguridad, del tamaño de tus transacciones, de la cantidad de
filas involucradas en la operaciones DML, etc, asi sera mas practico el uso
de procedimientos almacenados que de triggers.


AMB


"SergioT" wrote:

Hola
Gracias por tu codigo es muy ilustrativo lo probare en seguida, por tus
comentarios me parece que el uso de trigers no es bueno para actualizaciones
automaticas , yo pensaba que ese era el ideal para trigers, automatizar
actualizaciones, pero si no es ese su mejor uso , para que sirven o en que
es bueno utilizarlos?

Salu2
Sergio

"Alejandro Mesa" escribió en el
mensaje news:
> 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
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida