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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 08 March 2023 10:49

tweaxy
Participant actif
Lieu: Abbeville
Date d'inscription: 27 Dec 2018
Messages: 76

Detection des tables avec clause WITH OID = TRUE

Bonjour,

Pour pouvoir passer de Pg 9.6 vers pg 13, une étape importante est de corriger les tables ayant la clause WITH OID = TRUE (plus compatible à partir de pg12).
Pour toute ces tables, nous allons créer une séquence + créer un attribut en base pour stocker les valeurs actuelles et conserver un attribut "oid" en dur cette fois-ci pour ne pas avoir d'impact sur nos outils SIG.

J'ai donc tenté de lister toutes ces tables via la requête suivante :

select
    pt.schemaname ,
    pt.tablename
from
    pg_catalog.pg_class pc
    join pg_catalog.pg_tables pt on pc.relname=pt.tablename
where
    pc.relhasoids
    and pt.schemaname != 'pg_catalog';


Cela semble fonctionner mais cela me liste aussi des tables donc la clause WITH OID est à FALSE.
Je suis donc allé voir 2 tables spécifiques (une avec la clause TRUE et l'autre FALSE) pour lister leurs attributs via cette requête :

SELECT DISTINCT
            *
        FROM
        pg_attribute pa
        JOIN pg_catalog.pg_class pc on pa.attrelid = pc.oid
        JOIN pg_catalog.pg_tables pt on pc.relname=pt.tablename
        WHERE
            pc.relhasoids
            AND    attname = 'oid'
            AND pt.schemaname IN ('m_education_jeunesse','bdcarto')
            AND tablename IN ('centre_loisir','toponymeçzone_habitat');


Je vois apparaître une ligne attname = 'oid' pour ma table centre_loisir qui n'a pas cette clause à TRUE, et qui n'a pas non plus d'attribut nommé 'oid' dans la table.

Pour assurer mon test, je suis passé par un

SELECT oid FROM m_education_jeunesse.centre_loisir;


pour vérifier et il n'en existe pas.

Je ne comprends pas pourquoi certaines tables avec cette clause OID FALSE sort dans ma requête, ni pourquoi dans pg_attribute j'ai des lignes pour des attname 'oid' sur des tables qui n'en ont pas.

Peut-on 'nettoyer' les tables systèmes ? Cela pourrait-il provenir de manipulations historiques avec des résidus qui seraient restés ?

Cordialement,
Léandre BERON

Hors ligne

 

#2 Thu 09 March 2023 11:14

ftsig31
Participant occasionnel
Date d'inscription: 16 Feb 2011
Messages: 29

Re: Detection des tables avec clause WITH OID = TRUE

Bonjour

J'ai utilisé la requête suivante pour lister les tables avec des oid à supprimer :

Code:

    SELECT 'ALTER TABLE "' || n.nspname || '"."' || c.relname || '" SET WITHOUT OIDS;'
    FROM pg_catalog.pg_class c
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE 1=1
      AND c.relkind = 'r'
      AND c.relhasoids = true
      AND n.nspname <> 'pg_catalog' 
    order by n.nspname, c.relname;

Cordialement
Fabrice

Hors ligne

 

#3 Thu 23 March 2023 10:59

tweaxy
Participant actif
Lieu: Abbeville
Date d'inscription: 27 Dec 2018
Messages: 76

Re: Detection des tables avec clause WITH OID = TRUE

Bonjour,

Merci pour votre retour.
Sur un autre forum, une solution a également été proposée.
Je la soumet ici aussi :

select n.nspname, c.relname from
pg_class c join pg_namespace n on c.relnamespace=n.oid
and nspname!='pg_catalog'
and relhasoids;


Cordialement,
Léandre

Hors ligne

 

Pied de page des forums

Powered by FluxBB