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 CHECK
que chama uma plpgsql
função que verifica se uma condição está em alguma outra tabela não relacionada. Se essa última tabela não for carregada psql
antes da anterior, ocorrerá um erro.
A seguir, é apresentado um SSCCE que produz um banco de dados com o qual uma vez despejado pg_dump
nã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.
CHECK
restrição, todas as garantias serão anuladas, porque isso não é oficialmente suportado, apenas tolerado. Mas declarar a CHECK
restrição NOT VALID
fez funcionar para mim em todos os aspectos. Pode haver casos de canto eu nunca toquei ...
-X
e-d
opções parapg_dump
.pg_dump
produz um despejo que é restaurável em um banco de dados vazio.