Para descartar e recriar dinamicamente uma restrição de chave estrangeira, você pode envolver tudo em uma função ou usar o
DO
comando:DO
$body$
DECLARE
_con text := (
SELECT quote_ident(conname)
FROM pg_constraint
WHERE conrelid = 'myschema.mytable'::regclass
AND confrelid = 'myschema.myreftable'::regclass
LIMIT 1 -- there could be multiple fk constraints. Deal with it ...
);
BEGIN
EXECUTE '
ALTER TABLE wuchtel12.bet DROP CONSTRAINT ' || _con;
-- do stuff here
EXECUTE '
ALTER TABLE myschema.mytable
ADD CONSTRAINT ' || _con || ' FOREIGN KEY (col)
REFERENCES myschema.myreftable (col)';
END
$body$
Você deve possuir a tabela para usar
ALTER TABLE
.Senão você pode criar uma função com
LANGUAGE plpgsql SECURITY DEFINER
(usando o mesmo corpo) e ALTER FUNCTION foo() OWNER TO postgres;
postgres
sendo um superusuário aqui - ou o dono da mesa.Mas não deixe de saber o que o manual tem a dizer sobre segurança.
O manual também tem mais sobre comandos dinâmicos.