PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte de suppression PostgreSQL avec un nom inconnu

Pour supprimer et recréer dynamiquement une contrainte de clé étrangère, vous pouvez tout envelopper dans une fonction ou utiliser le DO commande :

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$

Vous devez posséder la table pour utiliser ALTER TABLE .
Sinon, vous pouvez créer une fonction avec LANGUAGE plpgsql SECURITY DEFINER (utilisant le même corps) et

ALTER FUNCTION foo() OWNER TO postgres;

postgres être un superutilisateur ici - ou le propriétaire de la table.
Mais assurez-vous de savoir ce que le manuel a à dire sur la sécurité.

Le manuel contient également plus d'informations sur les commandes dynamiques.