He obtenido un volcado de mi base de datos PostgreSQL con:
pg_dump -U user-name -d db-name -f dumpfile
que luego procedo a restaurar en otra base de datos con:
psql X -U postgres -d db-name-b -f dumpfile
Mi problema es que la base de datos contiene restricciones referenciales, comprobaciones y disparadores y algunos de estos (comprobaciones que parecerían en particular) fallan durante la restauración, ya que la información no se carga en el orden que haría que se respetaran esas comprobaciones. Por ejemplo, insertar una fila en una tabla puede estar asociado con un CHECK
que llama a una plpgsql
función que verifica si una condición se mantiene en alguna otra tabla no relacionada. Si esa última tabla no se carga psql
antes que la anterior, se produce un error.
El siguiente es un SSCCE que produce una base de datos de este tipo que una vez vertida pg_dump
no se puede restaurar:
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
¿Hay alguna manera de deshabilitar (desde la línea de comando) todas esas restricciones durante la restauración del volcado y habilitarlas nuevamente nuevamente después? Estoy ejecutando PostgreSQL 9.1.
CHECK
restricción, todas las garantías se anulan, porque eso no se admite oficialmente, solo se tolera. Pero declarar la CHECK
restricción lo NOT VALID
hizo funcionar para mí en todos los aspectos. Puede haber casos de esquina que nunca toqué ...
-X
y-d
parapg_dump
.pg_dump
produce un volcado que se puede restaurar en una base de datos vacía.