RE:bucles anidados recorriendo dos cursores
Publicado por
Neville (1 intervención) el 11/10/2022 22:43:12
yo tengo un problema parecido necesito guardar datos de la tabla inserted y de la tabla deleted en el mismo registro de la tabla que audita pero cuando hago el update no funciona el trigger, les dejo el codigo a ver si me pueden ayudar...
ALTER TRIGGER [dbo].[TAU_AUDITOR] ON [SWNOMMSSQL000002].[dbo].[swnomper]
AFTER UPDATE AS
declare
@LI_ID INT, --Id de tabla T_Auditor
@LI_COUNT INT, --Contador para cursor inserted, para correr 1 vez por corrida del cursor deleted
@LI_CEDULA INT, --[CEDULA]
@LI_CODPRO INT, --[CODPRO]
@LI_TIPNOM INT, --[TIPNOM]
@LI_CODSUC INT, --[CODSUC]
@LI_CODDIR INT, --[CODDIR]
@LI_CODVP INT, --[CODVP]
@LI_CODGER INT, --[CODGER]
@LI_CODDEP INT, --[CODDEP]
@LS_ESTADO VARCHAR(15), --[ESTADO]
@LI_SUESAL INT, --[SUESAL]
@LS_NOMBRE VARCHAR(25), --[NOMBRES]
@LS_APELLID VARCHAR(25), --[APELLIDOS]
@LI_CEDULA_OLD INT, --[CEDULA]
@LI_CODPRO_OLD INT, --[CODPRO]
@LI_TIPNOM_OLD INT, --[TIPNOM]
@LI_CODSUC_OLD INT, --[CODSUC]
@LI_CODDIR_OLD INT, --[CODDIR]
@LI_CODVP_OLD INT, --[CODVP]
@LI_CODGER_OLD INT, --[CODGER]
@LI_CODDEP_OLD INT, --[CODDEP]
@LS_ESTADO_OLD VARCHAR(15), --[ESTADO]
@LI_SUESAL_OLD INT, --[SUESAL]
@LS_NOMBRE_OLD VARCHAR(25), --[NOMBRES]
@LS_APELLID_OLD VARCHAR(25), --[APELLIDOS]
@LS_DATA_OLD VARCHAR(150), --String con todos los datos antes de los cambios
@LS_DATA_NEW VARCHAR(150), --String con todos los cambios realizados
@LS_USER VARCHAR(50);
--Desactivando notificaciones de actualizacion
SET NOCOUNT ON
--Inicializacion de las variables nuevas
SELECT @LI_CEDULA = 0, @LI_CODPRO = 0, @LI_TIPNOM = 0, @LI_CODSUC = 0, @LI_CODDIR = 0,
@LI_CODVP = 0, @LI_CODGER = 0, @LI_CODDEP = 0, @LS_ESTADO = '', @LI_SUESAL = 0,
@LS_NOMBRE = '', @LS_APELLID = '',
--Inicializacion de las variables antiguas
@LI_CEDULA_OLD = 0, @LI_CODPRO_OLD = 0, @LI_TIPNOM_OLD = 0, @LI_CODSUC_OLD = 0,
@LI_CODDIR_OLD = 0, @LI_CODVP_OLD = 0, @LI_CODGER_OLD = 0, @LI_CODDEP_OLD = 0,
@LS_ESTADO_OLD = '', @LI_SUESAL_OLD = 0, @LS_NOMBRE_OLD = '', @LS_APELLID_OLD = '',
@LS_DATA_OLD = '', @LS_DATA_NEW = '', @LI_ID = 0, @LS_USER = '';
--Incrementar el id
SELECT @LI_ID = CASE
WHEN MAX (id) IS NULL THEN 1
ELSE MAX (id) + 1
END
FROM db_pruebas.dbo.T_Auditor
--Captura del Usuario
SELECT @LS_USER = USER;
--Declaracion de cursor para tabla inserted
DECLARE DELETED_CURSOR CURSOR FOR
SELECT CEDULA, CODPRO, TIPNOM, CODSUC, CODDIR, CODVP,
CODGER, CODDEP, ESTADO, SUESAL, NOMBRES, APELLIDOS
FROM DELETED
OPEN DELETED_CURSOR
--Insertar registros en las variables
FETCH NEXT FROM DELETED_CURSOR INTO @LI_CEDULA_OLD, @LI_CODPRO_OLD, @LI_TIPNOM_OLD, @LI_CODSUC_OLD, @LI_CODDIR_OLD,
@LI_CODVP_OLD, @LI_CODGER_OLD, @LI_CODDEP_OLD, @LS_ESTADO_OLD, @LI_SUESAL_OLD,
@LS_NOMBRE_OLD, @LS_APELLID_OLD
WHILE @@FETCH_STATUS = 0
BEGIN
--Se coloca el cursor en 1 para que el cursor haga 1 sola corrida
SET @LI_COUNT = 1;
--Declaracion de cursor para tabla inserted
DECLARE INSERTED_CURSOR CURSOR FOR
SELECT CEDULA, CODPRO, TIPNOM, CODSUC, CODDIR, CODVP,
CODGER, CODDEP, ESTADO, SUESAL, NOMBRES, APELLIDOS
FROM INSERTED
OPEN INSERTED_CURSOR
--Concatenar a un String todos los campos borrados para ver la traza
SELECT @LS_DATA_OLD = CONCAT (@LI_CEDULA_OLD, '//', @LI_CODPRO_OLD, '//', @LI_TIPNOM_OLD, '//', @LI_CODSUC_OLD,
'//', @LI_CODDIR_OLD, '//', @LI_CODVP_OLD, '//', @LI_CODGER_OLD, '//', @LI_CODDEP_OLD,
'//', @LS_ESTADO_OLD,'//', @LI_SUESAL_OLD, '//', @LS_NOMBRE_OLD, '//', @LS_APELLID_OLD)
--Incrementar el id
SELECT @LI_ID = CASE
WHEN MAX (id) IS NULL THEN 1
ELSE MAX (id) + 1
END
FROM db_pruebas.dbo.T_Auditor
BEGIN
FETCH NEXT FROM INSERTED_CURSOR INTO @LI_CEDULA, @LI_CODPRO, @LI_TIPNOM, @LI_CODSUC, @LI_CODDIR,
@LI_CODVP, @LI_CODGER, @LI_CODDEP, @LS_ESTADO, @LI_SUESAL,
@LS_NOMBRE, @LS_APELLID
-- Condicion para que el cursor solo haga una corrida
while @LI_COUNT = 1
--Se concatenan todos los valores del registro afectados actualizados
SELECT @LS_DATA_NEW = CONCAT (@LI_CEDULA,'//',@LI_CODPRO,'//',@LI_TIPNOM,'//',@LI_CODSUC,'//',@LI_CODDIR,'//',
@LI_CODVP,'//',@LI_CODGER,'//',@LI_CODDEP,'//',@LS_ESTADO,'//',@LI_SUESAL,'//',
@LS_NOMBRE,'//',@LS_APELLID)
BEGIN
INSERT INTO [db_pruebas].[dbo].[T_Auditor] (id, accion, datos_ingresados, datos_ingresados_old,
usuario, fecha, hora, host, tabla_modificada)
VALUES (@LI_ID, 'UPDATE', @LS_DATA_NEW, @LS_DATA_OLD, @LS_USER,
CONVERT (date, GETDATE()), CONVERT (time, GETDATE()), HOST_NAME(), 'swnomper')
FETCH NEXT FROM DELETED_CURSOR INTO @LI_CEDULA_OLD, @LI_CODPRO_OLD, @LI_TIPNOM_OLD, @LI_CODSUC_OLD, @LI_CODDIR_OLD,
@LI_CODVP_OLD, @LI_CODGER_OLD, @LI_CODDEP_OLD, @LS_ESTADO_OLD, @LI_SUESAL_OLD,
@LS_NOMBRE_OLD, @LS_APELLID_OLD
FETCH NEXT FROM INSERTED_CURSOR INTO @LI_CEDULA, @LI_CODPRO, @LI_TIPNOM, @LI_CODSUC, @LI_CODDIR,
@LI_CODVP, @LI_CODGER, @LI_CODDEP, @LS_ESTADO, @LI_SUESAL,
@LS_NOMBRE, @LS_APELLID
--Se coloca el cursor en 0 para que no cumpla la condicion
SET @LI_COUNT = 0;
END
END
END
--Cerrado de cursores
CLOSE DELETED_CURSOR
CLOSE INSERTED_CURSOR
--Vaciado de cursores de la memoria
DEALLOCATE DELETED_CURSOR
DEALLOCATE INSERTED_CURSOR