SQL - Triggers

 
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Triggers

Publicado por Isaías (5072 intervenciones) el 31/05/2007 01:09:18
¿Al PRINCIPIO de la tabla?, SQL Server, no maneja posicionamiento de campos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Triggers

Publicado por Rogelio Carmona (36 intervenciones) el 31/05/2007 14:46:46
checa el script

Dia, es el primer campo de la tabla y la llave primaria

CREATE TABLE Tabla (
Dia DATETIME NOT NULL
CONSTRAINT PK_Tabla
PRIMARY KEY CLUSTERED (Dia),

ahora se tendra que agregar el campo IdTasa

CREATE TABLE SrTasasDeInteres (
IdTasa SMALLINT NOT NULL,
CONSTRAINT PK_SrTasasDeInteres
PRIMARY KEY (IdTasa, Dia),
Dia DATETIME NOT NULL,

y actualizar los triggers para que ahora se actualizen los datod por IdTasa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Triggers

Publicado por Isaías (5072 intervenciones) el 01/06/2007 17:38:36
Insisto Rogelio

En todo caso, deberias hacer un ALTER TABLE a tu tabla para agregar una nueva columna, ¿no es cierto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar