2012/7/19 Marcos Aurelio Nobre <[email protected]>
> BINGO !
>
> Esse SELECT mata-a-pau o que preciso !
> Valeu Matheus, é exatamente isso.
>
>
Sussa...
> Aproveitando......
>
> Como eu acredito que no PostgreSQL não há como "desativar" uma
> FK-constraint então se eu quisesse deletar as constraints que são listadas
> na coluna 1 dessa query eu deveria excluir da relação :
> PG_CATALOG.PG_CONSTRAINT ?
>
>
Nunca... Jamais... Em hipótese alguma... Execute UPDATE, DELETE ou INSERT
nas tabelas de catálogo do PostgreSQL, isso pode ser desastroso e é um
pecado mortal (ao menos que você esteja "debugando" algo, sob o risco de
corromper o catálogo).
Mas, se você realmente precisa excluir FOREIGN KEYS em batch, eu
recomendaria um shell script ou uma função PL/pgSQL (com o comando
EXECUTE), assim você pode gerar o script para "recriar" antes de excluir,
veja que a definição da FOREIGN KEY é recuperada com a função
pg_get_constraintdef, daí é só concaternar o ALTER TABLE.
Exemplo (não sei se funfa com certeza, feito de cabeça), função com RETURNS
SETOF TEXT que remove e retorna o script pra recriar:
FOR v_cons, v_rel, v_def IN
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*' AND
c.contype = 'f'
ORDER BY 1
LOOP
EXECUTE 'ALTER TABLE ' || v_rel || ' DROP CONSTRAINT ' || v_cons;
RETURN NEXT 'ALTER TABLE ' || v_rel || ' ADD CONSTRAINT ' || v_cons ||
' ' || v_def || ';';
END LOOP;
ou \d+ schema.tabela
>
Fato: retirei essa query do próprio comando \d+ do psql (invocado com -E),
fica a dica...
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral