Triggers
Publicado por Rogelio Carmona (36 intervenciones) el 30/05/2007 15:29:25
El siguiente es un script que contiene la creacion de una tabla y algunos triggers.
Lo que hacen esos triggers es actualizar los acumulados por cada que se actualiza la tabla
ya sea por un Insert, Update o Delete y funciona bien
ahora lo que se requiere es agregar el campo IdTasa al principio de la tabla y que siga funcionando igual, solo que ahora en vez de que solo el campo Dia sea la llave, la llave la conformarán IdTasa y Dia, pudiendo borrar grupos de datos
estoy un poco atorado con esto, gracias
DROP TABLE Tabla
GO
CREATE TABLE Tabla (
Dia DATETIME NOT NULL
CONSTRAINT PK_Tabla
PRIMARY KEY CLUSTERED (Dia),
Tasa DECIMAL(5,2) NOT NULL,
FTasaDia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA DIARIO
FTasaAcu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA ACUMULADO
FTasa01Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 1 DIARIO
FTasa01Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 1 ACUMULADO
FTasa02Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 2 DIARIO
FTasa02Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 2 ACUMULADO
FTasa03Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 3 DIARIO
FTasa03Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 3 ACUMULADO
Acum INTEGER NOT NULL DEFAULT 0 -- SOLO PARA CONTROLAR EL TRIGGER DE DELETE Y FORZAR EL RECALCULO DE LOS ACUMULADOS.
)
GO
GRANT SELECT ON Tabla TO public
GO
CREATE TRIGGER Tabla_I ON Tabla WITH ENCRYPTION FOR INSERT AS
UPDATE Tabla
SET Tabla.Tasa = Tabla.Tasa
FROM Tabla
INNER JOIN INSERTED
ON Tabla.Dia = INSERTED.Dia
GO
CREATE TRIGGER Tabla_U ON Tabla WITH ENCRYPTION FOR UPDATE AS
IF UPDATE(FTasaAcu) OR UPDATE(FTasa01Acu) OR UPDATE(FTasa02Acu) OR UPDATE(FTasa03Acu)
BEGIN
ROLLBACK TRANSACTION
RAISERROR("(Tabla_U). Las columas de Tasas del día y acumulados, no son modificables.",16,1)
RETURN
END
IF UPDATE(Tasa)
BEGIN
UPDATE Tabla
SET Tabla.FTasaDia = ROUND( Tabla.Tasa / 36000.000, 10),
Tabla.FTasa01Dia = ROUND((Tabla.Tasa + 1) / 36000.000, 10),
Tabla.FTasa02Dia = ROUND((Tabla.Tasa + 2) / 36000.000, 10),
Tabla.FTasa03Dia = ROUND((Tabla.Tasa + 3) / 36000.000, 10)
FROM Tabla
INNER JOIN INSERTED
ON Tabla.Dia = INSERTED.Dia
END
IF UPDATE(Tasa) OR UPDATE(Dia) OR UPDATE(Acum)
BEGIN
DECLARE @Dia DATETIME
DECLARE ModAcumulados CURSOR FOR
SELECT Dia FROM Tabla
WHERE Dia >= (SELECT MIN(Dia) FROM INSERTED)
ORDER BY Dia
OPEN ModAcumulados
FETCH NEXT FROM ModAcumulados INTO @Dia
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Tabla
SET Tabla.FTasaAcu = Tabla.FTasaDia + ISNULL(Ayer.FTasaAcu,0),
Tabla.FTasa01Acu = Tabla.FTasa01Dia + ISNULL(Ayer.FTasa01Acu,0),
Tabla.FTasa02Acu = Tabla.FTasa02Dia + ISNULL(Ayer.FTasa02Acu,0),
Tabla.FTasa03Acu = Tabla.FTasa03Dia + ISNULL(Ayer.FTasa03Acu,0)
FROM Tabla
LEFT OUTER JOIN Tabla Ayer
ON Tabla.Dia - 1 = Ayer.Dia
WHERE Tabla.Dia = @Dia
FETCH NEXT FROM ModAcumulados INTO @Dia
END
CLOSE ModAcumulados
DEALLOCATE ModAcumulados
END
GO
CREATE TRIGGER Tabla_D ON Tabla WITH ENCRYPTION FOR DELETE AS
UPDATE Tabla
SET Tabla.Acum = 0
FROM Tabla
WHERE Tabla.Dia > (SELECT MIN(Dia) FROM DELETED)
GO
-- SELECT * FROM SRTabla
Lo que hacen esos triggers es actualizar los acumulados por cada que se actualiza la tabla
ya sea por un Insert, Update o Delete y funciona bien
ahora lo que se requiere es agregar el campo IdTasa al principio de la tabla y que siga funcionando igual, solo que ahora en vez de que solo el campo Dia sea la llave, la llave la conformarán IdTasa y Dia, pudiendo borrar grupos de datos
estoy un poco atorado con esto, gracias
DROP TABLE Tabla
GO
CREATE TABLE Tabla (
Dia DATETIME NOT NULL
CONSTRAINT PK_Tabla
PRIMARY KEY CLUSTERED (Dia),
Tasa DECIMAL(5,2) NOT NULL,
FTasaDia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA DIARIO
FTasaAcu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA ACUMULADO
FTasa01Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 1 DIARIO
FTasa01Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 1 ACUMULADO
FTasa02Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 2 DIARIO
FTasa02Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 2 ACUMULADO
FTasa03Dia DECIMAL(10,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 3 DIARIO
FTasa03Acu DECIMAL(14,10) NOT NULL DEFAULT 0, -- FACTOR TASA + 3 ACUMULADO
Acum INTEGER NOT NULL DEFAULT 0 -- SOLO PARA CONTROLAR EL TRIGGER DE DELETE Y FORZAR EL RECALCULO DE LOS ACUMULADOS.
)
GO
GRANT SELECT ON Tabla TO public
GO
CREATE TRIGGER Tabla_I ON Tabla WITH ENCRYPTION FOR INSERT AS
UPDATE Tabla
SET Tabla.Tasa = Tabla.Tasa
FROM Tabla
INNER JOIN INSERTED
ON Tabla.Dia = INSERTED.Dia
GO
CREATE TRIGGER Tabla_U ON Tabla WITH ENCRYPTION FOR UPDATE AS
IF UPDATE(FTasaAcu) OR UPDATE(FTasa01Acu) OR UPDATE(FTasa02Acu) OR UPDATE(FTasa03Acu)
BEGIN
ROLLBACK TRANSACTION
RAISERROR("(Tabla_U). Las columas de Tasas del día y acumulados, no son modificables.",16,1)
RETURN
END
IF UPDATE(Tasa)
BEGIN
UPDATE Tabla
SET Tabla.FTasaDia = ROUND( Tabla.Tasa / 36000.000, 10),
Tabla.FTasa01Dia = ROUND((Tabla.Tasa + 1) / 36000.000, 10),
Tabla.FTasa02Dia = ROUND((Tabla.Tasa + 2) / 36000.000, 10),
Tabla.FTasa03Dia = ROUND((Tabla.Tasa + 3) / 36000.000, 10)
FROM Tabla
INNER JOIN INSERTED
ON Tabla.Dia = INSERTED.Dia
END
IF UPDATE(Tasa) OR UPDATE(Dia) OR UPDATE(Acum)
BEGIN
DECLARE @Dia DATETIME
DECLARE ModAcumulados CURSOR FOR
SELECT Dia FROM Tabla
WHERE Dia >= (SELECT MIN(Dia) FROM INSERTED)
ORDER BY Dia
OPEN ModAcumulados
FETCH NEXT FROM ModAcumulados INTO @Dia
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Tabla
SET Tabla.FTasaAcu = Tabla.FTasaDia + ISNULL(Ayer.FTasaAcu,0),
Tabla.FTasa01Acu = Tabla.FTasa01Dia + ISNULL(Ayer.FTasa01Acu,0),
Tabla.FTasa02Acu = Tabla.FTasa02Dia + ISNULL(Ayer.FTasa02Acu,0),
Tabla.FTasa03Acu = Tabla.FTasa03Dia + ISNULL(Ayer.FTasa03Acu,0)
FROM Tabla
LEFT OUTER JOIN Tabla Ayer
ON Tabla.Dia - 1 = Ayer.Dia
WHERE Tabla.Dia = @Dia
FETCH NEXT FROM ModAcumulados INTO @Dia
END
CLOSE ModAcumulados
DEALLOCATE ModAcumulados
END
GO
CREATE TRIGGER Tabla_D ON Tabla WITH ENCRYPTION FOR DELETE AS
UPDATE Tabla
SET Tabla.Acum = 0
FROM Tabla
WHERE Tabla.Dia > (SELECT MIN(Dia) FROM DELETED)
GO
-- SELECT * FROM SRTabla
Valora esta pregunta


0