Ayuda con Trigger

31/10/2007 - 22:49 por ateixeiram | Informe spam
Amigos,
Soy nuevo en esto de los Triggers y le spido por favor me apoyen a
resolver este dilema en el que me encuentro.

Estoy trabajando con SQL2000 y he creado una tabla de Auditoria para
todas las tablas de mi modulo.

El problema esta que cuando a una tabla especifica le hago un Update
masivo digamos Where codigo=1 y me de como reultado mas de 1 fila el
triger de auditoria solo me inserta un registro y el resto los obvia.
He tratado de leer sobre Triggers con cursores pero aún no he
encontrado un ejemplo a seguir.

Aquí les envio el codigo del Trigger a ver si me pueden ayudar:

CREATE TRIGGER AuditoriaCoactivoUpdate_CoactivoValorDetalleCtaCte
ON CoactivoValorDetalleCtaCte
FOR UPDATE
AS
DECLARE @TxDesAud Varchar(8000), @Cadena Varchar(1000), @CoIdtTabAud
Int, @CoUsu Smallint
SET @TxDesAud = ''
SET @Cadena = ''

SELECT @CoIdtTabAud = CoIdtCVDC, @CoUsu = CoUsu FROM Deleted

IF UPDATE (CoIdtCoaExp)
BEGIN
SELECT @Cadena = CONVERT(Varchar,CoIdtCoaExp) FROM Deleted
SET @Cadena = ISNULL(@Cadena,'NULL')
SET @TxDesAud = @TxDesAud +
COL_NAME(OBJECT_ID('CoactivoValorDetalleCtaCte'), 2) + '(' + @Cadena +
')'
END
IF UPDATE (TxEstCVDC)
BEGIN
SELECT @Cadena = ISNULL(TxEstCVDC,'NULL') FROM Deleted -- Cadena
IF LEN(@TxDesAud)>0
BEGIN
SET @TxDesAud = @TxDesAud + '; '
END
SET @TxDesAud = @TxDesAud +
COL_NAME(OBJECT_ID('CoactivoValorDetalleCtaCte'), 24) + '(' + @Cadena
+ ')'
END

IF LEN(@TxDesAud) > 0
BEGIN
INSERT INTO AuditoriaCoactivo
(TxEveAud, TxTabAud, CoIdtTabAud, TxDesAud, CoUsu)
VALUES
('Update', 'CoactivoValorDetalleCtaCte', @CoIdtTabAud, @TxDesAud,
@CoUsu)
END
GO

Muchisimas gracias de antemano por el apoyo prestado a mi
interrogante.

Aldo TM
Lima - Peru
 

Leer las respuestas

#1 jeastman - Hotmail
01/11/2007 - 01:52 | Informe spam
Hola hermano.

Lo que está pasando es que en las tablas virtuales (creo que ese es el
nombre que se les da) inserted y deleted tienes todos los registros que
fueron afectados, es decir, el trigger se llama una sola vez para para el
grupo de registros que fueron afectados en la modificación.

Ahora, no vayas a utilizar cursores para solucionar el problema, si me pasas
la estructura de la tabla y me identificas adecuadamente la clave primaria
de la misma, con mucho gusto te presento una posible solución.

Saludos.

escribió en el mensaje
news:
Amigos,
Soy nuevo en esto de los Triggers y le spido por favor me apoyen a
resolver este dilema en el que me encuentro.

Estoy trabajando con SQL2000 y he creado una tabla de Auditoria para
todas las tablas de mi modulo.

El problema esta que cuando a una tabla especifica le hago un Update
masivo digamos Where codigo=1 y me de como reultado mas de 1 fila el
triger de auditoria solo me inserta un registro y el resto los obvia.
He tratado de leer sobre Triggers con cursores pero aún no he
encontrado un ejemplo a seguir.

Aquí les envio el codigo del Trigger a ver si me pueden ayudar:

CREATE TRIGGER AuditoriaCoactivoUpdate_CoactivoValorDetalleCtaCte
ON CoactivoValorDetalleCtaCte
FOR UPDATE
AS
DECLARE @TxDesAud Varchar(8000), @Cadena Varchar(1000), @CoIdtTabAud
Int, @CoUsu Smallint
SET @TxDesAud = ''
SET @Cadena = ''

SELECT @CoIdtTabAud = CoIdtCVDC, @CoUsu = CoUsu FROM Deleted

IF UPDATE (CoIdtCoaExp)
BEGIN
SELECT @Cadena = CONVERT(Varchar,CoIdtCoaExp) FROM Deleted
SET @Cadena = ISNULL(@Cadena,'NULL')
SET @TxDesAud = @TxDesAud +
COL_NAME(OBJECT_ID('CoactivoValorDetalleCtaCte'), 2) + '(' + @Cadena +
')'
END
IF UPDATE (TxEstCVDC)
BEGIN
SELECT @Cadena = ISNULL(TxEstCVDC,'NULL') FROM Deleted -- Cadena
IF LEN(@TxDesAud)>0
BEGIN
SET @TxDesAud = @TxDesAud + '; '
END
SET @TxDesAud = @TxDesAud +
COL_NAME(OBJECT_ID('CoactivoValorDetalleCtaCte'), 24) + '(' + @Cadena
+ ')'
END

IF LEN(@TxDesAud) > 0
BEGIN
INSERT INTO AuditoriaCoactivo
(TxEveAud, TxTabAud, CoIdtTabAud, TxDesAud, CoUsu)
VALUES
('Update', 'CoactivoValorDetalleCtaCte', @CoIdtTabAud, @TxDesAud,
@CoUsu)
END
GO

Muchisimas gracias de antemano por el apoyo prestado a mi
interrogante.

Aldo TM
Lima - Peru

Preguntas similares