Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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=#
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
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
Parfait,
c'était tout a fait ça.
Merci
Hors ligne
Pages : 1