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
 

Leer las respuestas

#1 Jesús López
27/06/2007 - 09:51 | Informe spam
Suponiendo que las tablas sean estas:

CREATE TABLE Proyectos
(
CodProyecto int PRIMARY KEY,
NombreProyecto varchar(50) NOT NULL,
Total money
)

CREATE TABLE Facturas
(
NumFactura int PRIMARY KEY,
CodProyecto int NOT NULL REFERENCES Proyectos(CodProyecto),
FechaFactura smalldatetime NOT NULL DEFAULT GETDATE(),
Importe money NOT NULL
)

GO

El siguiente trigger actualizaría automáticamente el campo Total de la tabla
Proyectos:

CREATE TRIGGER ActualizarTotalFacturas
ON Facturas
FOR INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
WITH IncrementosFacturas(CodProyecto, Incremento)
AS
(
SELECT CodProyecto, SUM(Importe) AS Incremento
FROM
(
SELECT CodProyecto, Importe
FROM inserted
UNION ALL
SELECT CodProyecto, -Importe
FROM deleted
) AS F
GROUP BY CodProyecto
)
UPDATE P
SET Total = COALESCE(P.Total, 0) + [IF].Incremento
FROM IncrementosFacturas [IF] INNER JOIN Proyectos P
ON [IF].CodProyecto = P.CodProyecto

END
GO


Pero para la próxima vez, ten en cuenta que una vista indexada es más
eficiente y más sencillo que esto de los triggers.


Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"Juan Diego Bueno" escribió en el mensaje
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



Preguntas similares