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 CHECKque llama a una plpgsqlfunción que verifica si una condición se mantiene en alguna otra tabla no relacionada. Si esa última tabla no se carga psqlantes 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_dumpno 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.
CHECKrestricción, todas las garantías se anulan, porque eso no se admite oficialmente, solo se tolera. Pero declarar la CHECKrestricción lo NOT VALIDhizo funcionar para mí en todos los aspectos. Puede haber casos de esquina que nunca toqué ...
-Xy-dparapg_dump.pg_dumpproduce un volcado que se puede restaurar en una base de datos vacía.