#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