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

#1 04/11/2010 12:01:40

gngassam
Membre

mise à jour PG_CLASS

Bonjour,

j'utilise postgreSQL 8.4 sous linux. La table pg_class continu de référencer une table qui n'existe pourtant plus. comment le mettre a jour. J'ai fait un VACUUM (sans FULL, car en prod) et un ANALYZE. Rien n'y fait.

Merci d'avance

Hors ligne

#2 04/11/2010 12:10:54

Marc Cousin
Membre

Re : mise à jour PG_CLASS

Salut,

Quel genre d'enregistrement c'est ?

Peux tu faire un SELECT de cet enregistrement de pg_class et le poster ici ?


Marc.

Hors ligne

#3 04/11/2010 12:17:00

gngassam
Membre

Re : mise à jour PG_CLASS

Ci-joint la réponse du select.

-[ RECORD 1 ]--+----------------------------------
relname        | asset_rights_OLD
relnamespace   | 2200
reltype        | 17572
relowner       | 16534
relam          | 0
relfilenode    | 17570
reltablespace  | 0
relpages       | 4545
reltuples      | 501125
reltoastrelid  | 0
reltoastidxid  | 0
relhasindex    | t
relisshared    | f
relistemp      | f
relkind        | r
relnatts       | 9
relchecks      | 0
relhasoids     | f
relhaspkey     | t
relhasrules    | f
relhastriggers | t
relhassubclass | f
relfrozenxid   | 1513
relacl         | {mayo=arwdDxt/mayo,homsys=r/mayo}

Hors ligne

#4 04/11/2010 14:24:21

gleu
Administrateur

Re : mise à jour PG_CLASS

Pourquoi cette table ne devrait plus exister ? elle a été supprimée ? comment ?

D'après cet enregistrement, elle existe bien, dans le schéma public et le tablespace par défaut.


Guillaume.

Hors ligne

#5 04/11/2010 16:40:10

gngassam
Membre

Re : mise à jour PG_CLASS

gleu a écrit :

Pourquoi cette table ne devrait plus exister ?

testifr=# \c mayo2
psql (8.4.4)
Vous êtes maintenant connecté à la base de données « mayo2 ».
mayo2=# select * from pg_tables where tablename ='asset_rights_OLD';
schemaname |    tablename     | tableowner | tablespace | hasindexes | hasrules | hastriggers
------------+------------------+------------+------------+------------+----------+-------------
public     | asset_rights_OLD | mayo       |            | t          | f        | t
(1 ligne)

mayo2=# \d asset_rights_OLD
Aucune relation nommée « asset_rights_OLD » n'a été trouvée.
mayo2=#

gleu a écrit :

elle a été supprimée ? comment ?

oui, je l'ignore

Sauf que lorsque j'ai voulu exécuter un script qui récupère l'ensemble des tables pour faire des GRANT j'ai eu cette erreur:


mayo2=# select pg_grant('view_4_mview_user','select','%','public');
ERROR:  relation "public.asset_rights_old" does not exist
CONTEXTE : SQL statement "GRANT select ON public.asset_rights_OLD TO view_4_mview_user"
PL/pgSQL function "pg_grant" line 11 at EXECUTE statement
mayo2=#

ci-joint le script:

CREATE FUNCTION pg_grant(TEXT, TEXT, TEXT, TEXT)
RETURNS integer AS '
DECLARE obj record;
num integer;
BEGIN
num:=0;
FOR obj IN SELECT relname FROM pg_class c
JOIN pg_namespace ns ON (c.relnamespace = ns.oid) WHERE
relkind in (''r'',''v'',''S'') AND
nspname = $4 AND
relname LIKE $3
LOOP
EXECUTE ''GRANT '' || $2 || '' ON '' || $4||''.''||obj.relname || '' TO '' || $1;
num := num + 1;
END LOOP;
RETURN num;
END;
' LANGUAGE plpgsql SECURITY DEFINER;

par contre, J'ai eu a faire une migration de cette BD 8.1.15 => 8.4. il y'a quelque temps deja

Hors ligne

#6 04/11/2010 16:55:21

gleu
Administrateur

Re : mise à jour PG_CLASS

Par défaut, sans double guillemets, tout nom d'objet est mis automatiquement en minuscule. Et il n'existe pas de table asset_rights_old. Par contre, il existe une table asset_rights_OLD.

À priori, \d "asset_rights_OLD" devrait vous indiquer que la table existe bien. Et l'instruction GRANT doit aussi avoir les guillemets, ie il ne doit pas y avoir

GRANT select ON public.asset_rights_OLD TO view_4_mview_user

mais

GRANT select ON public."asset_rights_OLD" TO view_4_mview_user

Guillaume.

Hors ligne

#7 04/11/2010 17:25:50

gngassam
Membre

Re : mise à jour PG_CLASS

Parfait,

c'était tout a fait ça.

Merci

Hors ligne

Pied de page des forums