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

#6 Juan Diego Bueno
27/06/2007 - 19:22 | Informe spam
Muchas gracias Carlos, ahora solo me toca procesar... lo que me has escrito.

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í.

He leído mucho sobre lo que habeis puesto en otros encuentros, pero ya sabes
que a veces uno actua con lo primero que conoce o se le ocurre, por eso no
he profundizado más.

De todas maneras... he de reconocer que nunca se me había ocurrido usar un
join en un update, y justamente después de haber escrito el correo, en un
libro sobre sql server hablando de triggers, vi que podía hacerlo. Después
rehice el trigger con la cte.

Tuve una muy buena profesora de SQL Server y diseño de base de datos en su
momento. Lo que me explicó, me lo explicó muy bien, pero obviamente, hay
muchas otras cosas que no me contó por falta de tiempo, con lo cual
agradezco muy mucho estas sugerencias.

Por otra parte, Carlos, renombrar las tablas es lo que no quiero por
cuestiones de nomenclatura. Casi me sale más a cuento cambiar los
dataadapter para que tomen de la vista y por lo que cuentas, creo que mejor
debo seguir usando los triggers, ya que son consultas muy frecuentes.
Hablamos de que el proyecto es la entidad central de la aplicación y se
hacen muchas consultas sobre esos datos económicos. Como los triggers tal
cual están planteados se basan en cálculos relativos a los datos ya
almacenados en ese campo, el problema puede venir de que alguno de estos
campos calculados se cambien a capón (que nunca se sabe). De todas formas,
tengo SP's que recalculan de nuevo los campos que puedo lanzar con algún
tipo de proceso cuando se detecten inconsistencias (de momento hasta que
aprenda a usar las vistas indexadas y tenga otras variantes)

Me reafirmo en el agradecimiento a los tres

Saludos



"principiante" escribió en el mensaje
news:
Lo mejor es una vista indexada para esas cosas.
Para eso las inventaron.


Jose TH


"Juan Diego Bueno" wrote in message
news:
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







Respuesta Responder a este mensaje
#7 Carlos M. Calvelo
27/06/2007 - 20:24 | Informe spam
Hola Juan,

On 27 jun, 19:22, "Juan Diego Bueno"
wrote:

Por otra parte, Carlos, renombrar las tablas es lo que no quiero por
cuestiones de nomenclatura. Casi me sale más a cuento cambiar los
dataadapter para que tomen de la vista y por lo que cuentas, creo que mejor
debo seguir usando los triggers, ya que son consultas muy frecuentes.



No sugiero que lo cambies. La solución y sugerencias de Jesús ya
estaban muy bien y tienes la situación que tienes. Ya está!
Solo me pareció un buen momento para, al hilo de los otros
encuentros, aclarar aquí un poco mas.
Imagínate que tienes 20 aplicaciones distintas que usan el nombre
de la tabla X intensivamente, pero no saben si X es una tabla base
o una vista y lo puedes cambiar en cualquier momento en la bbdd
(p.e. X siempre ha sido un tabla base y a partir de hoy es una
vista) y las aplicaciones no se enteran. Un mecanismo bastante potente
no? ;-)

Saludos,
Carlos
Respuesta Responder a este mensaje
#8 Maxi
27/06/2007 - 21:03 | Informe spam
Hola, bueno no siempre es la mejor solucion, la de triggers no es mala ni
mucho menos :)


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"principiante" escribió en el mensaje
news:
Lo mejor es una vista indexada para esas cosas.
Para eso las inventaron.


Jose TH


"Juan Diego Bueno" wrote in message
news:
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







Respuesta Responder a este mensaje
#9 Carlos M. Calvelo
27/06/2007 - 21:24 | Informe spam
Hola Juan,


update facturas
set total = total + sum(i.importe)
from facturas f inner join inserted i on f.CodProyecto > i.CodProyecto


update facturas
set total = total - sum(d.importe)
from facturas f inner join deleted d on f.CodProyecto > d.CodProyecto




Perdona, pero esto está mal.
No te rompas la cabeza con ello!

Saludos,
Carlos
Respuesta Responder a este mensaje
#10 principiante
27/06/2007 - 21:56 | Informe spam
No es por nada pero usted en sus mensajes cuando le dicen triggers dice
vista indexada y cuando le dicen vista indexada dice triggers... Quien le
entiende, amigo ? :(
Segun lo que el ha explicado se adapta mejor a una vista indexada aunque
tambien se pueda por triggers.


Jose TH



"Maxi" escribió en el mensaje
news:
Hola, bueno no siempre es la mejor solucion, la de triggers no es mala ni
mucho menos :)


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"principiante" escribió en el mensaje
news:
Lo mejor es una vista indexada para esas cosas.
Para eso las inventaron.


Jose TH


"Juan Diego Bueno" wrote in message
news:
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











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