Estoy tratando de hacer una especie de mini fórmula para que se guarden los registros de mi BD, no está completado, por lo que falta algunas cosas (como el usuario, la IP de dónde se conecta)
Tabla para guardar unos nombre cualesquiera:
Código:
Tabla para guardar los cambios (léase auditoria):CREATE TABLE nombres ( nombres_id serial NOT NULL, nombre1 character varying(20), nombre2 character varying(20) );
Código:
Función para obtener el nombre del primer campo de una tabla (el nombre puede variar, pero se sabe que es el primer campo):CREATE TABLE control ( tabla character varying NOT NULL, campo character varying NOT NULL, valor_anterior character varying, valor_nuevo character varying, opcion character varying NOT NULL, ocurrencia time without time zone NOT NULL );
Código:
Función disparadora que almacena en la tabla control:CREATE FUNCTION captura(character varying) RETURNS character varying AS $_$SELECT column_name FROM information_schema.columns WHERE table_name = $1 AND ordinal_position = 1;$_$ LANGUAGE sql;
Código:
Ahora bien, sí en la cónsola ejecuto:CREATE FUNCTION controlador() RETURNS "trigger" AS $$DECLARE nombre_campo character varying; BEGIN nombre_campo := captura('TG_RELNAME'); IF (TG_OP = 'DELETE') THEN INSERT INTO control (tabla, campo, valor_nuevo, opcion, ocurrencia) VALUES (TG_RELNAME, 'nombre_campo', NEW.nombre_campo, TG_OP, now()); RETURN OLD; ELSIF ((TG_OP = 'UPDATE') OR (TG_OP = 'INSERT')) THEN INSERT INTO control (tabla, campo, valor_nuevo, opcion, ocurrencia) VALUES (TG_RELNAME, 'nombre_campo', NEW.nombres_id, TG_OP, now()); RETURN NEW; END IF; END; $$ LANGUAGE plpgsql;
Código:
se observa que funciona. Pero sí, ejecuto un insert sobre la tabla de prueba nombres:pruebas=# SELECT captura('nombres'); captura ------------ nombres_id (1 fila)
Código:
cuando hago una consulta sobre la tabla control, obtengo:insert into nombres (nombre1, nombre2) values ('cccc','dddd');
Código:
donde se observa que el nombre del primer campo de la tabla, no se está guardando correctamente.pruebas=# SELECT * FROM control ; tabla | campo | valor_anterior | valor_nuevo | opcion | ocurrencia ---------+--------------+----------------+-------------+--------+----------------- nombres | nombre_campo | | 27 | INSERT | 17:25:07.398235 (3 filas)
alguna luz? de antemano, gracias