Um eine Fremdschlüsseleinschränkung dynamisch zu löschen und neu zu erstellen, können Sie alles in eine Funktion packen oder den DO
verwenden Befehl:
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$
Sie müssen Eigentümer der Tabelle sein, um ALTER TABLE
verwenden zu können .
Andernfalls können Sie eine Funktion mit LANGUAGE plpgsql SECURITY DEFINER
erstellen (mit demselben Körper) und
ALTER FUNCTION foo() OWNER TO postgres;
postgres
ein Superuser hier sein - oder der Eigentümer der Tabelle.
Aber achten Sie darauf, was das Handbuch über Sicherheit zu sagen hat.
Das Handbuch hat auch mehr über dynamische Befehle.