Eu obtive um despejo do meu banco de dados PostgreSQL com:
pg_dump -U user-name -d db-name -f dumpfile
que depois procuro restaurar em outro banco de dados com:
psql X -U postgres -d db-name-b -f dumpfile
Meu problema é que o banco de dados contém restrições referenciais, verificações e gatilhos, e algumas delas (verificações ao que parece, em particular) falham durante a restauração, pois as informações não são carregadas na ordem em que essas verificações sejam respeitadas. Por exemplo, a inserção de uma linha em uma tabela pode estar associada a uma CHECKque chama uma plpgsqlfunção que verifica se uma condição está em alguma outra tabela não relacionada. Se essa última tabela não for carregada psqlantes da anterior, ocorrerá um erro.
A seguir, é apresentado um SSCCE que produz um banco de dados com o qual uma vez despejado pg_dumpnão pode ser restaurado:
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());
Existe uma maneira de desativar (na linha de comando) todas essas restrições durante a restauração de despejo e ativá-las novamente depois? Estou executando o PostgreSQL 9.1.
CHECKrestrição, todas as garantias serão anuladas, porque isso não é oficialmente suportado, apenas tolerado. Mas declarar a CHECKrestrição NOT VALIDfez funcionar para mim em todos os aspectos. Pode haver casos de canto eu nunca toquei ...
-Xe-dopções parapg_dump.pg_dumpproduz um despejo que é restaurável em um banco de dados vazio.