PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Drop-Constraint mit unbekanntem Namen

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.