viernes, 27 de abril de 2012

Limpiar tabla con campos OID en postgresql

Limpieza de postgresql despues de usar campos OID
Primero pasar los campos de oid a bytea (hay varias páginas que hablan de las ventajas y desventajas de cada uno pero lo importante es que bytea es más sql y al momento de borrar realmente se borra, puede exportarse el esquema in una tabla en particular que tenga campos bytea etc)




CREATE OR REPLACE FUNCTION merge_oid(val oid)
returns bytea as $$
declare merged bytea;
declare arr bytea;
 BEGIN
   FOR arr IN SELECT data from pg_largeobject WHERE loid = val ORDER BY pageno LOOP
     IF merged IS NULL THEN
       merged := arr;
     ELSE
       merged := merged || arr;
     END IF;
   END LOOP;
  RETURN merged;

END
$$ LANGUAGE plpgsql;


update <tabla> set <campo bytea>=merge_oid(<campo oid>)  where true ;

-- limpiar lo_objects
-- https://bugs.launchpad.net/ubuntu/+source/postgresql-8.4/+bug/887138


vacuumlo -v -U postgres -W -h localhost <basededatos>  

Este comando está en ubuntu en el paquete contrib  así que es necesario instalar postgresql-8.4-contrib o similares.

Otra alternativa usando una funcion :
http://www.microolap.com/products/connectivity/postgresdac/help/TipsAndTricks/ByteaVsOid.htm


No hay comentarios:

Publicar un comentario