Duda sobre triggers

27/06/2007 - 08:24 por Juan Diego Bueno | Informe spam
Buenas:

Quería preguntaros como resolveis una situación concreta.
Tengo una tabla de proyectos cuya clave es un código. En ella tenemos un
campo TOTAL que recoge la suma de los importes de unas facturas que están en
otra tabla.Yo lo estoy resolviendo usando triggers tanto para eliminación
como para inserción y actualización, pero dichos desencadenadores acaban
usando cursores que recorren las tablas deleted o inserted. Dado que por
cuestiones de rendimiento no se aconseja el uso de cursores, ¿cómo podría
resolver esta situación de otra forma?

Se me ocurre que podría no usar ese campo y obtener el TOTAL en base a una
consulta, pero tal cual lo tengo ahora, me obligaría a cambiar bastantes
partes de mi aplicación, con lo cual quiero evitarlo.

Uso SQL Server 2005 Express

Gracias

Preguntas similare

Leer las respuestas

#11 Carlos M. Calvelo
27/06/2007 - 22:09 | Informe spam
Hola otra vez Juan,

On 27 jun, 16:38, "Carlos M. Calvelo" wrote:

En cuanto al trigger que te ha dado Jesús, quizás para entender
mejor lo que pasa, si lo necesitas, puedes verlo asi:




Mejor asi:

1. En el trigger del insert:

update Proyectos
set total = total + ( select sum(inserted.Importe) from
inserted where inserted.CodProyecto=P.CodProyecto)
from inserted inner join Proyectos P on inserted.CodProyecto P.CodProyecto

2. En el trigger del delete:

update Proyectos
set total = total - ( select sum(deleted.Importe) from deleted
where deleted.CodProyecto=P.CodProyecto)
from deleted inner join Proyectos P on deleted.CodProyecto P.CodProyecto

3. Y en el trigger del update: 1. y 2.

Saludos,
Carlos
Respuesta Responder a este mensaje
#12 Juan Diego Bueno
27/06/2007 - 22:36 | Informe spam
Gracias Carlos, no te preocupes, lo había visto por encima, además se parece
a lo que hice inicialmente.

De todas formas, me gusta más la solución de Jesús que permite hacerlo todo
con un solo trigger para las tres operaciones y en principio, todas las
pruebas que he hecho han funcionado a la perfección.


"Carlos M. Calvelo" escribió en el mensaje
news:
Hola otra vez Juan,

On 27 jun, 16:38, "Carlos M. Calvelo" wrote:

En cuanto al trigger que te ha dado Jesús, quizás para entender
mejor lo que pasa, si lo necesitas, puedes verlo asi:




Mejor asi:

1. En el trigger del insert:

update Proyectos
set total = total + ( select sum(inserted.Importe) from
inserted where inserted.CodProyecto=P.CodProyecto)
from inserted inner join Proyectos P on inserted.CodProyecto P.CodProyecto

2. En el trigger del delete:

update Proyectos
set total = total - ( select sum(deleted.Importe) from deleted
where deleted.CodProyecto=P.CodProyecto)
from deleted inner join Proyectos P on deleted.CodProyecto P.CodProyecto

3. Y en el trigger del update: 1. y 2.

Saludos,
Carlos
Respuesta Responder a este mensaje
#13 Carlos M. Calvelo
27/06/2007 - 23:00 | Informe spam
On 27 jun, 22:36, "Juan Diego Bueno"
wrote:

De todas formas, me gusta más la solución de Jesús que permite hacerlo todo
con un solo trigger para las tres operaciones



Perfecto!
Un buen ejercicio! :)

Saludos,
Carlos
Respuesta Responder a este mensaje
#14 Alfredo Novoa
28/06/2007 - 01:14 | Informe spam
On Wed, 27 Jun 2007 08:24:28 +0200, "Juan Diego Bueno"
wrote:


Quería preguntaros como resolveis una situación concreta.
Tengo una tabla de proyectos cuya clave es un código. En ella tenemos un
campo TOTAL que recoge la suma de los importes de unas facturas que están en
otra tabla.Yo lo estoy resolviendo usando triggers tanto para eliminación
como para inserción y actualización, pero dichos desencadenadores acaban
usando cursores que recorren las tablas deleted o inserted. Dado que por
cuestiones de rendimiento no se aconseja el uso de cursores, ¿cómo podría
resolver esta situación de otra forma?



¿Que tal una vista indexada?


Saludos
Respuesta Responder a este mensaje
#15 Alfredo Novoa
28/06/2007 - 01:21 | Informe spam
On Wed, 27 Jun 2007 19:22:15 +0200, "Juan Diego Bueno"
wrote:

Principiante: Aún no he profundizado en las vistas indexadas, y cuando supe
de su existencia ya había empezado a hacer la aplicación así.



Aun estás a tiempo. Creas la vista, borras los triggers y listo. Así
practicas :)


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