PDA

Ver la Versión Completa : Trigger con funcion CONCAT_WS


Jose Roman
15-01-2022, 06:38:35
Cordial saludo,
Tengo una tabla donde deseo que se guarde los INSERT, UPDATE y DELETE que hace el usuario que ingrese al sistema, esto para guardar una auditoria de quien hizo cualquier modificación en las tablas.

CREATE TABLE reg_mod (
ID_REG timestamp NOT NULL,
ID_USR varchar(15) NOT NULL,
TP_OPE char(1) NOT NULL COMMENT 'I - INSERT U - UPDATE D - DELETE',
NB_TAB varchar(7) NOT NULL COMMENT 'NOMBRE TABLA',
PK_COL varchar(15) NOT NULL COMMENT 'VALOR PRIMARY KEY',
RG_ANT text,
RG_NEW text,
PRIMARY KEY (ID_REG,ID_USR))

Para guardar los cambios lo hago con este procedimiento almacenado:


DELIMITER $$
CREATE PROCEDURE REG_HIS(IN vHOR TIMESTAMP, IN vUSR VARCHAR(15), IN vOPE CHAR(1), IN vTAB VARCHAR(7),
IN vCLA VARCHAR(15), IN vOLD TEXT, IN vNEW TEXT)
BEGIN
INSERT INTO reg_mod (ID_REG,ID_USR,TP_OPE,NB_TAB,PK_COL,RG_ANT,RG_NEW)
VALUES (vHOR,vUSR,vOPE,vTAB,vCOL,vCLA,vCLV,vOLD,vNEW);
END$$
DELIMITER ;

En cada tabla pienso hacer un TRIGGER BEFORE UPDATE, BEFORE INSERT y BEFORE DELETE que me guarde la información que deseo en la tabla reg_mod, como por ejemplo de una tabla llamada LISTA:

DELIMITER $$
CREATE TRIGGER `BI_LISTA` BEFORE INSERT ON `lista`
FOR EACH ROW BEGIN
DECLARE vUSR VARCHAR(15);
# SE UBICA EL USUARIO QUE INICIO SESION PERO SOLO SE EXTRAE EL NOMBRE QUE TENGA ANTES DEL @
SET vUSR = LEFT(SESSION_USER(),LOCATE('@',SESSION_USER(),1) - 1);
CALL REG_HIS(NOW(),vUSR,'I','LISTA',new.id_lis,NULL,CONCAT_WS(char(10 using utf8),CONCAT('ID_LIS = ',new.id_lis),CONCAT('DESCRI= ',new.descri));
END$$
DELIMITER ;

Pero esto me genera el siguiente error en phpmyadmin:

Error
consulta SQL: Copiar


CREATE TRIGGER `BI_LISTA` BEFORE INSERT ON `lista`
FOR EACH ROW BEGIN
DECLARE vUSR VARCHAR(15);
# SE UBICA EL USUARIO QUE INICIO SESION PERO SOLO SE EXTRAE EL NOMBRE QUE TENGA ANTES DEL @
SET vUSR = LEFT(SESSION_USER(),LOCATE('@',SESSION_USER(),1) - 1);
CALL REG_HIS(NOW(),vUSR,'I','LISTA',new.id_lis,NULL,CONCAT_WS(char(10 using utf8),CONCAT('ID_LIS = ',new.id_lis),CONCAT('DESCRI= ',new.descri));
END
MySQL ha dicho: Documentación

#1064 - Algo está equivocado en su sintax cerca ';
END' en la linea 6

En este trigger solo estoy tratando de guardar dos campos de una tabla en RG_NEW por ser un INSERT, habrán tablas en las que hayan mas campos para guardar en REG_MOD y necesito que se guarde con salto de linea dos mas registros en REG_ANT (si es un UPDATE o DELETE) o en REW_NEW (si es un INSERT o UPDATE), de esta manera:

https://i.stack.imgur.com/eHyUk.png

Cual es el error que me esta generando el trigger?