Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Sun 21 January 2018 14:41

tematim
Juste Inscrit !
Date d'inscription: 27 Oct 2017
Messages: 7

Essayer une liste d'alter table

Bonjour,

Je suis actuellement sur un projet qui possède des tables en entrées et je dois reformater les contenus avec parfois des types différents.

Du coup, en amont, je souhaite mettre en place des contrôles afin de valider la possibilité de l'effectuer.

Par exemple, dans une table je dois faire 3 alter table :

Code:

ALTER TABLE maTable
ALTER COLUMN colonne1 TYPE varchar(254);

ALTER TABLE maTable
ALTER COLUMN colonne3 TYPE varchar(20) USING (colonne3::numeric::VARCHAR(20));

ALTER TABLE maTable
ALTER COLUMN colonne2 TYPE varchar(254);

Si dans la colonne3, la conversion n'est pas possible, alors je dois retourner false.

Il y a environ 30 alter à tester, je sais que je dois également tester le schema afin de vérifier l'existence de chaque colonne.

Dois-je créer des copies temporaires et valider 1 puis 2 puis 3 puis x alter afin d'obtenir celui qui fait bloquer le processus ?

Merci d'avance pour votre aide.

Hors ligne

 

#2 Mon 22 January 2018 12:09

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1129

Re: Essayer une liste d'alter table

Salut,

Si vous utiliser votre fichier SQL avec pgAdmin,
vous avez la possibilité de n’exécuter que la partie  de la requête
que vous avez sélectionnée.

Si vous exécuter votre fichier de requête avec psql,
vous pouvez enclencher la variable ON_ERROR_STOP
qui fera stopper psql à la première erreur rencontrée
et rajouter des blocs de fonction anonyme entre chaque
alter qui vous informeront sur l'avancement de la requête :

exemple :

Code:

ALTER TABLE toto ALTER tata RENAME TO titi;
DO language plpgsql $$
BEGIN
  RAISE NOTICE 'ALTER de la table toto exécutée!';
END
$$;

Dernière modification par tumasgiu (Mon 22 January 2018 14:08)

Hors ligne

 

#3 Mon 22 January 2018 21:10

tematim
Juste Inscrit !
Date d'inscription: 27 Oct 2017
Messages: 7

Re: Essayer une liste d'alter table

Bonsoir,

Je vais mettre tous les alters dans une fonction, voici mon code actuel :

Code:

SET search_path TO gracethd, public;

 

-------------------------------------------------------------------------------------

--

-- Suppression de la table Logs puis re-creation

--

-------------------------------------------------------------------------------------

DROP TABLE IF EXISTS Logs;

CREATE TABLE Logs

(

gid SERIAL,

etape varchar IS NOT NULL,

commentaire varchar IS NOT NULL,

gidConcerne varchar IS NULL,

dateEnregistrement datetime IS NOT NULL

);

 

-------------------------------------------------------------------------------------

--Nom : Insert_Logs

--Desc : Insertion d'une ligne dans la table des logs

--

--Appelant : 

-------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION Insert_Logs(

etape varchar,

commentaire varchar

, isGidSpecific boolean default false

, gidConcerne varchar default '42')

RETURNS void AS

$$

DECLARE

BEGIN

                if isGidSpecific = false then

                               execute 'INSERT INTO Logs(etape,commentaire,dateEnregistrement) VALUES ('''|| etape || ''',''' || commentaire || ''',''' || current_timestamp || ''')';

                else

                               execute 'INSERT INTO Logs(etape,commentaire,gidConcerne,dateEnregistrement) VALUES ('''|| etape || ''',''' || commentaire || ''',''' || gidConcerne ||''',''' || current_timestamp || ''')';

                end if;

END

$$ LANGUAGE plpgsql;

 

---------------------------------------------------------------------------------------------------------------------------------------------------

 

CREATE OR REPLACE FUNCTION Execute_All_Alter(

, isADNSpecific boolean default false)

RETURNS void AS

$$

DECLARE

                test_update INTEGER := 0;

BEGIN

                if(SELECT count(column_name)

                               FROM information_schema.columns

                               WHERE table_name = 'adresse' and column_name = 'maColonne' and data_type = 'character varying' and character_maximum_length = '254') = 1 then

                                               test_update = (select Insert_Logs('Alter_table_adresse_maColonne','Colonne déja transformee'));

                                               raise notice 'test_update : %', test_update;

                else

                               if(SELECT count(column_name)

                               FROM information_schema.columns

                               WHERE table_name = 'adresse' and column_name = 'maColonne') = 1 then

                                               execute 'ALTER TABLE adresse ALTER COLUMN maColonne TYPE varchar(254)';

                                               test_update = (select Insert_Logs('Alter_table_adresse_maColonne','Colonne transformee'));

                                               raise notice 'test_update : %', test_update;

                               else

                                               test_update = (select Insert_Logs('Alter_table_adresse_maColonne','Colonne non presente'));

                                               raise notice 'test_update : %', test_update;

                               end if;

                end if;

END

$$ LANGUAGE plpgsql;

 

SET search_path TO gracethd, public;

               

DO $$ BEGIN

PERFORM Execute_All_Alter();

END $$;

Je ne sais pas comment 'activer' et 'désactiver' le ON_ERROR_STOP.

Hors ligne

 

#4 Mon 22 January 2018 23:04

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1129

Re: Essayer une liste d'alter table

Cette variable est une variable d'environnement du programme psql,
donc il faut l'activer quand vous exécutez votre commande avec psql :

Code:

psql --set ON_ERROR_STOP =1 -f /chemin/vers/mon/fichier_de_requete.sql

Hors ligne

 

Pied de page des forums

Powered by FluxBB