PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Vincolo di rilascio PostgreSQL con nome sconosciuto

Per rilasciare e ricreare dinamicamente un vincolo di chiave esterna, puoi racchiuderlo tutto in una funzione o utilizzare il 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$

Devi possedere la tabella per usare ALTER TABLE .
Altrimenti puoi creare una funzione con LANGUAGE plpgsql SECURITY DEFINER (usando lo stesso corpo) e

ALTER FUNCTION foo() OWNER TO postgres;

postgres essere un superutente qui o il proprietario del tavolo.
Ma assicurati di sapere cosa dice il manuale sulla sicurezza.

Il manuale contiene anche ulteriori informazioni sui comandi dinamici.