Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/07/2009, 16:09
cacr
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
desarrollando mi propio sistema de auditoria para las BD internas

Saludos

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:
CREATE TABLE nombres (
    nombres_id serial NOT NULL,
    nombre1 character varying(20),
    nombre2 character varying(20)
);
Tabla para guardar los cambios (léase auditoria):
Código:
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
);
Función para obtener el nombre del primer campo de una tabla (el nombre puede variar, pero se sabe que es el primer campo):
Código:
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;
Función disparadora que almacena en la tabla control:
Código:
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;
Ahora bien, sí en la cónsola ejecuto:
Código:
pruebas=# SELECT captura('nombres');
  captura
------------
 nombres_id
(1 fila)
se observa que funciona. Pero sí, ejecuto un insert sobre la tabla de prueba nombres:
Código:
insert into nombres (nombre1, nombre2) values ('cccc','dddd');
cuando hago una consulta sobre la tabla control, obtengo:
Código:
pruebas=# SELECT * FROM control ;
  tabla  |    campo     | valor_anterior | valor_nuevo | opcion |   ocurrencia
---------+--------------+----------------+-------------+--------+-----------------
 nombres | nombre_campo |                | 27          | INSERT | 17:25:07.398235
(3 filas)
donde se observa que el nombre del primer campo de la tabla, no se está guardando correctamente.

alguna luz? de antemano, gracias
__________________
Gracias de todas todas
-----
Linux!