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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Maxi
01/11/2007 - 15:52 | Informe spam
Hola, los trigger nos se disparan por registro sino por instruccion, usted
dentro del trigger esta manejando como si siempre fuera por registro, lo que
deberia hacer es modificar el codigo para que utilice conjuntos de datos y
no uno en particular.
Por ejemplo

insert into su tabla
select campos from (inserted o deleted)
where condiciones


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
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
Respuesta Responder a este mensaje
#3 Aldo
08/11/2007 - 21:04 | Informe spam
Muchas gracias por la intencion de ayudarme,

Aqui va la estructura de mi tabla:

CREATE TABLE dbo.CoactivoExpediente (
CoIdtCoaExp int NOT NULL ,
NuNumCoaExp int NOT NULL ,
NuAniCoaExp smallint NOT NULL ,
TxAuxCoaExp varchar(3) NOT NULL ,
TxAntCoaExp varchar(25) NULL ,
TxTipCoaExp char(1) NOT NULL ,
TxConCoaExp char(1) NULL ,
CoIdtExpAgr int NULL ,
TxGenExpAgr char(1) NULL ,
CoIdtCtaCte int NOT NULL ,
CoSecCtaCte int NOT NULL ,
CoIdtCoaPro tinyint NOT NULL ,
TxTipPer char(1) NOT NULL ,
CoAdmInf char(10) NOT NULL ,
CoPer char(10) NOT NULL ,
TxTipPat char(1) NULL ,
CoIdtPat int NULL ,
CoIdtEmp int NOT NULL ,
NuCanResCoaExp tinyint NULL ,
CoIdtCCD tinyint NULL ,
CoIdtCSD smallint NULL ,
oIdtDoc int NULL ,
CoIdtCVD int NULL ,
NuMonInsCoaExp real NULL ,
NuGasEmiCoaExp real NULL ,
NuFacActCoaExp real NULL ,
NuIntDiaCoaExp real NULL ,
TxObsCoaExp varchar(1000) NULL ,
TxEstCoaExp char(1) NULL DEFAULT 'A',
CoUsu smallint NULL ,
TxDesPc varchar(50) NULL DEFAULT Host_Name()
FeCre smalldatetime NULL DEFAULT GETDATE()
)
GO
ALTER TABLE CoactivoExpediente
ADD CONSTRAINT CoactivoExpediente_CPK PRIMARY KEY CLUSTERED
(CoIdtCoaExp)
GO

La clave para la tabla de auditoria es CoIdtCoaExp

Muchas gracias de antemano.
ATM

On 31 oct, 19:52, "jeastman - Hotmail" wrote:
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, eltriggerse 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.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida