Despues de mucho batallar me salio el dicho log de elimanados

From: Marcelino Guerrero <mguerreroh(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Despues de mucho batallar me salio el dicho log de elimanados
Date: 2006-11-24 16:56:52
Message-ID: 45672454.8030009@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Amigos,

Luego de mucho batallar me termine con el dicho log de registros eliminados, lo adjunto por si alguno de Uds lo pudiera
necesitar y también si lo pudieran mejorar, aun hay un detalle que no me gusta, pero no tengo otra, quizás mas adelante
me de mas tiempo y lo mejoro o alguno de Uds. lo puede hacer.

1.- Antes de eliminar cualquier registro o registros, necesito copiarlo a un esquema eliminados, donde deberá de existir
una tabla con el mismo nombre de la tabla de donde se desea eliminar, pero con el prefijo "log_".

2.- La estructura del archivo los es sencilla:
ord serial, para saber el orden.
seq int4, es una secuencia para saber donde empieza el registro y donde termina
campo varchar, aquí se grabara el nombre del campo
contenido text, el contenido del campo.
usuario varchar, el usuario que elimino el registro
f_borrado timestamp, por defecto now()
3.- Los parámetros a enviar son:
- tabla, nombre de la tabla
- campo, que servirá para definir que registro o registros se eliminara
- valor del campo, el valor del anterior
- usuario, usuario que elimina el registro
- campo id del detalle, en caso que se elimine varios registros se deberá de enviar un campo que identifique a cada uno
de los registros en forma individual, hay que indicar que este es el nombre del campo mas no el valor, si fuera el caso
de que se elimine un registro de un maestro osea un solo registro, se podría repetir el del "campo".

Saludos a todos y espero que esta función pueda ser de utilidad a alguna persona de la lista, agradeceré si pudieran
comentarme si la perfeccionan, mejoran o le encuentran algún inconveniente.

Atte
Marcelino

CREATE OR REPLACE FUNCTION call_log("varchar", "varchar", "varchar", "varchar","varchar")
RETURNS void AS
$BODY$

DECLARE
-- $1 tabla
-- $2 campo para el where
-- $3 valor del campo para el where
-- $4 usuario
-- $5 campo id del detalle
princip RECORD;
mviews RECORD;
xcant int4;
xcont int4;
valor_campo2 varchar;
nureg int2;
BEGIN
FOR princip IN execute 'select count(' || $2 || ') as cant from ' || $1 || ' where ' || $2 || ' = ' ||
quote_literal($3) LOOP
xcant = princip.cant;
END LOOP;

xcont = 1;
nureg = 0;
WHILE xcont <= xcant LOOP
FOR princip IN execute 'select campo[' || xcont || '] from (select array(select ' || $5 || ' from ' || $1 ||
' where '
|| $2 || ' = ' || quote_literal($3) || ') as campo) as x' LOOP
valor_campo2 = princip.campo;
nureg = nureg + 1;
FOR mviews IN select atributo.attname as campo from pg_attribute atributo, pg_class clase, pg_tables tablas
where atributo.attrelid=clase.relfilenode and atributo.attstattarget = '-1' and
clase.relname=tablas.tablename and tablas.tablename = $1 order by atributo.attname LOOP
execute 'insert into eliminados.log_' || $1 || ' (seq,campo,contenido,usuario) values(' || nureg
|| ',' || quote_literal(mviews.campo)
|| ', (select ' || mviews.campo || ' from ' || $1 || ' where ' || $2 || ' =' || quote_literal($3) ||
' and ' || $5 || ' = ' || quote_literal(princip.campo) || '),' || quote_literal($4) || ')';
END LOOP;

END LOOP;
xcont = xcont + 1;
END LOOP;
RETURN;
END$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Sistemas C.M.P. 2006-11-24 16:56:57 Obtener el nombre del host con plpgsql
Previous Message Alvaro Herrera 2006-11-24 16:54:52 Re: Resultado extraño en query a tablas pg_attribute, pg_class, pg_tables