2017-08-02 2 views
0

Je dois mettre à jour toutes les colonnes de type "uuid" à "varchar (38)". J'ai créé toutes les requêtes nécessaires avec:Désactiver temporairement les contraintes de mise à jour du type de données des PK et des FK

SELECT format(
    'ALTER TABLE %I.%I.%I ALTER COLUMN %I SET DATA TYPE varchar(38);', 
    table_catalog, 
    table_schema, 
    table_name, 
    column_name 
) 
FROM information_schema.columns 
WHERE data_type = 'uuid' 
    AND table_schema NOT LIKE 'pg_%' 
    AND lower(table_schema) <> 'information_schema' 
    AND is_updatable = 'YES'; 

De toute évidence, je ne peux pas exécuter les requêtes résultant en raison de toutes les PK existantes et les contraintes FK impliquant les colonnes UUID.
Existe-t-il un moyen de désactiver temporairement les contraintes, puis d'exécuter toutes les requêtes et de réactiver les contraintes par la suite sans abandonner les contraintes?
Ou si je dois d'abord abandonner toutes les contraintes, y a-t-il un moyen de tout recommencer après les mises à jour? Je ne suis pas le créateur de la base de données, donc je n'ai pas toutes les requêtes nécessaires pour créer de nouveau les contraintes.

+0

Si les contraintes ne sont pas reportables, vous ne pouvez pas les "suspendre" - vous devez soit ordonner des actions ou les supprimer/les recréer. BTW si vous n'êtes pas le propriétaire de la contrainte, vous ne serez pas en mesure de le laisser tomber. sauf si vous êtes superutilisateur, mais si vous êtes un superutilisateur, vous pouvez faire n'importe quoi, donc "ne pas avoir toutes les requêtes nécessaires pour créer les contraintes" ne serait pas le cas - pas vrai? .. –

+0

ouais, je suis un super-utilisateur .. existe-t-il un moyen de construire une requête d'une manière en quelque sorte automatisée qui met en place toutes les contraintes actuellement actives? cela vaut la peine d'ouvrir une autre question, alors je suppose – Flugmango

Répondre

0

J'ai trouvé un moyen de créer toutes les requêtes pour déposer et créer toutes les contraintes de la base de données.
Alors d'abord je dois enregistrer la sortie de la première requête

SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";' 
FROM pg_constraint 
INNER JOIN pg_class ON conrelid=pg_class.oid 
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace 
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname; 

et de la deuxième requête

SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" ADD CONSTRAINT "'||conname||'" "'|| 
    pg_get_constraintdef(pg_constraint.oid)||'";' 
FROM pg_constraint 
INNER JOIN pg_class ON conrelid=pg_class.oid 
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace 
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC; 

Quand j'ai toutes les requêtes, je suis tombé tout pressèrent, mis à jour les tables et puis exécuté les requêtes pour ajouter à nouveau les contraintes. Travaillé parfaitement!