PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 02/02/2017 12:27:37

meta sql

J'écris souvent des scripts sql qui écrivent des scripts sql.

Jusqu'à présent, je faisais comme ça :

select 
           'alter table "' 
        || table_name_fk 
        || '" drop constraint "' 
        || column_name_fk 
        || '_fk"' 
        || ';'
from fks_contacts;

Existe-t-il en pg un procédé plus élégant ?

Merci

Hors ligne

#2 02/02/2017 15:44:19

rjuju
Administrateur

Re : meta sql

Bonjour,

à part utiliser quote_ident() à la place des '"' (et gérer le nom de schéma si besoin), pas trop possible de faire mieux.  Sur psql, vous pouvez utiliser \gexec  (depuis la version 9.6) qui exécutera le sql généré directement.

Hors ligne

#3 02/02/2017 15:59:39

Re : meta sql

Bonjour,

Je précise ma question : je veux transformer des contraintes PK et FK en contraintes UNIQUE.

Ces contraintes PK et FK pouvent, bien entendu, porter sur plusieurs colonnes.

Un query dans le data dictionnary me donnera toutes les infos sur les contraintes PK et FK.

Comment générer les commandes du type : alter table x add constraint unique (col1, col2, col3);

En fait, j'ai vu sur le net un procédé mais je ne me souviens plus où.

Mais il existe !

Bonne après-midi aux dalibiens !

Hors ligne

#4 02/02/2017 16:33:32

rjuju
Administrateur

Re : meta sql

Pour créer une contrainte unique qui correspond aux champs d'une PK :

WITH s AS (
    select conrelid, t.relname, unnest(c.conkey) as attnum
    from pg_constraint c
    join pg_class t on c.conrelid = t.oid
    where conname = 't1_pkey'
)

SELECT 'ALTER TABLE ' || quote_ident(s.relname) || ' ADD UNIQUE ('
       || string_agg(quote_ident(a.attname), ', ') || ') ;'
FROM s
JOIN pg_attribute a on a.attrelid = s.conrelid AND a.attnum = s.attnum
GROUP BY s.relname;

Vous pouvez adapter ça pour les FK ou autre au cas où j'aurais mal compris votre besoin.

Hors ligne

#5 06/02/2017 12:19:15

Re : meta sql

Merci !

Il me faudrait encore le data type de la colonne qui fait partie de la pk.

Pourriez-vous m'indiquer la solution optimale ?

Hors ligne

#6 06/02/2017 14:05:17

rjuju
Administrateur

Re : meta sql

Regardez sur http://docs.postgresql.fr/9.6/catalog-pg-attribute.html, et donc joindre pg_type pour récupérer l'information dont vous avez besoin sur le type.

Hors ligne

#7 06/02/2017 18:45:11

Re : meta sql

merci

ça marche encore mieux avec

    || string_agg(quote_ident(a.attname || ' (' || format_type(a.atttypid, a.atttypmod) || ') '), ', ')

Hors ligne

Pied de page des forums