Que no os den problemas los triggers.

23/11/2003 - 23:12 por Jorge Viñuales | Informe spam
Hace tiempo que tengo funcionando un par de aplicaciones hechas bajo SQL
Server. Os comento un par de conclusiones que he sacado, muy interesantes
acerca del trabajo con triggers.

Estas potentísimas herramientas de SQL, si no se miman mucho pueden dar más
problemas que alegrías.

Primero os diré dos cláusulas que tienen que ir siempre al principio de casi
cualquier trigger (justo después del as) y luego os explico porqué.

if @@rowcount = 0
return

set nocount on

Lo primero es porque muchas veces, puede desencadenarse un trigger de una
tabla, cuando en realidad no ha habido ninguna fila afectada en la acción
que lo ha desencadenado. Por ejemplo, cuando hay dos tablas A y B con una
relación, y tienen activada la opción actualización o eliminación en
cascada, al realizar una modificación en la tabla A, aunque no afecte a
ningún registro de la tabla B los triggers saltan. Si no habéis previsto en
el código del trigger que puede no haber filas afectadas se pueden producir
resultados inesperados (como me ha pasado a mi). Utilizando el control (if
@@rowcount = 0), se consigue que no se ejecute el código del trigger a no
ser que sea realmente necesario.

La segunda es fundamental si trabajáis con ADO. No solo para evitar que se
manden mensajes innecesarios al cliente, sino porque he comprobado que
muchas veces, ADO se vuelve loco (sobre todo con los mensajes de error) al
recibir los mensajes innecesarios que se generan dentro del trigger. Y esto
vale también para storeds.

Saludos y espero que os evite alguno de los problemas que yo he tenido por
culpa de esto.
 

Leer las respuestas

#1 Miguel Egea
24/11/2003 - 10:19 | Informe spam
Hola Jorge, gracias por conpartir con nosotros tus experiencias,

me surgen un par de comentarios/dudas
1.- Sobre set nocount on absolutamente de acuerdo, menos viajes entre
cliente y servidor.

Sin embargo sobre el @@rowcount, cuando he visto problemas con esto siempre
ha sido porque no se hacía un uso adecuado de inserted y deleted, pensando
que solamente contenían un registro (y siempre 1), instrucciones como select
@valor=campo from inserted, si este es el caso, no lo solucionaría
@@rowcount.

En cualquiera de los casos esto es lo que digo como tu bien dices en base a
mi experiencia.


Saludos

Miguel Egea
Microsoft SQL-SERVER MVP
Brigada Anti-Cursores

"Jorge Viñuales" escribió en el mensaje
news:
Hace tiempo que tengo funcionando un par de aplicaciones hechas bajo SQL
Server. Os comento un par de conclusiones que he sacado, muy interesantes
acerca del trabajo con triggers.

Estas potentísimas herramientas de SQL, si no se miman mucho pueden dar


más
problemas que alegrías.

Primero os diré dos cláusulas que tienen que ir siempre al principio de


casi
cualquier trigger (justo después del as) y luego os explico porqué.

if @@rowcount = 0
return

set nocount on

Lo primero es porque muchas veces, puede desencadenarse un trigger de una
tabla, cuando en realidad no ha habido ninguna fila afectada en la acción
que lo ha desencadenado. Por ejemplo, cuando hay dos tablas A y B con una
relación, y tienen activada la opción actualización o eliminación en
cascada, al realizar una modificación en la tabla A, aunque no afecte a
ningún registro de la tabla B los triggers saltan. Si no habéis previsto


en
el código del trigger que puede no haber filas afectadas se pueden


producir
resultados inesperados (como me ha pasado a mi). Utilizando el control (if
@@rowcount = 0), se consigue que no se ejecute el código del trigger a no
ser que sea realmente necesario.

La segunda es fundamental si trabajáis con ADO. No solo para evitar que se
manden mensajes innecesarios al cliente, sino porque he comprobado que
muchas veces, ADO se vuelve loco (sobre todo con los mensajes de error) al
recibir los mensajes innecesarios que se generan dentro del trigger. Y


esto
vale también para storeds.

Saludos y espero que os evite alguno de los problemas que yo he tenido por
culpa de esto.


Preguntas similares