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

Responder a