PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 07/08/2009 18:20:47

sophonie
Membre

Modification en cascade du propriétaire de la Base

Bonjour à tous et à toutes,

J'ai modifié le propriétaire de la base de données sur laquelle je travaille actuellement, cependant cette opération n'a pas modifié en cascade le propriétaire des tables associées à la base de données.

Quelle commande doit-on effectuer afin que les modifications puissent agir sur l'ensemble
des tables de la base de données, mais aussi sur les séquences, les index ...

Merci d'avance.
Sophonie.

Hors ligne

#2 07/08/2009 19:44:24

Marc Cousin
Membre

Re : Modification en cascade du propriétaire de la Base

Il n'y a pas de méthode magique je crois.
Habituellement je fais quelque chose du genre :
SELECT 'ALTER TABLE ' || tablename || ' SET OWNER=toto;' from pg_tables;
Et j'exécute ce qui en sort (avec du \i et \o)

Evidemment il faut rajouter une clause where à la requête et peaufiner un peu tout ça…


Marc.

Hors ligne

#3 07/08/2009 23:11:11

gleu
Administrateur

Re : Modification en cascade du propriétaire de la Base

À partir de la 8.2, il existe aussi REASSIGN OWNED BY (http://docs.postgresqlfr.org/8.4/sql-re … owned.html). Par exemple:

REASSIGN OWNED BY u1 TO u2;

Tous les objets appartenant à u1 auront pour nouveau propriétaire u2 (pour la base de données connectée).


Guillaume.

Hors ligne

#4 08/08/2009 08:42:09

Marc Cousin
Membre

Re : Modification en cascade du propriétaire de la Base

Intéressant. Va falloir que je perde mes vieux réflexes de DBA Oracle smile


Marc.

Hors ligne

#5 08/08/2009 12:15:10

sophonie
Membre

Re : Modification en cascade du propriétaire de la Base

Cependant un REASSIGN OWNED BY u1 TO u2 génère le message suivant :

ERREUR:  n'a pas pu supprimer les objets appartenant à rôle postgres car ils sont nécessaires au système de bases de données.

Pourtant je suis connecté à la base de données en question, et en tant qu'utilisateur
postgres!

Dernière modification par sophonie (08/08/2009 12:17:22)

Hors ligne

#6 08/08/2009 20:29:48

gleu
Administrateur

Re : Modification en cascade du propriétaire de la Base

Si vous avez remplacé u1 par postgres, cela ne peut pas fonctionner. postgres est un super-utilisateur et tous les catalogues systèmes lui appartiennent. Vous ne pouvez pas donner les droits des catalogues système à un autre utilisateur.

Quelle commande avez-vous réellement saisi ?


Guillaume.

Hors ligne

#7 09/08/2009 12:34:55

sophonie
Membre

Re : Modification en cascade du propriétaire de la Base

J'ai effectué la commande suivante:

 REASSIGN OWNED BY postgres TO sophonie;

Effectivement cela ne peut pas marcher.

Dernière modification par sophonie (09/08/2009 12:36:41)

Hors ligne

#8 09/08/2009 13:29:00

gleu
Administrateur

Re : Modification en cascade du propriétaire de la Base

En effet, l'utilisateur postgres possède des objets dont on ne peut pas le dé-posséder.


Guillaume.

Hors ligne

#9 09/08/2009 13:39:40

sophonie
Membre

Re : Modification en cascade du propriétaire de la Base

Bonjour gleu,

En tapant un \dts sur la base de données jogstore, j'ai 39 lignes (incluant tables, séquences, index).
Je ne voudrai pas (peu professionnel, et lourd...) de faire 39 fois, la commande suivante

ALTER  ... OWNER TO ...;

Autre question :

J'aurai voulu créer un bloc PL/PgSQL permettant d'effectuer cette modification ...
Comment m'y prendre, uniquement la méthode et non la solution (à but d'initiation)

Merci d'avance.
Sophonie.

Hors ligne

#10 09/08/2009 23:00:54

gleu
Administrateur

Re : Modification en cascade du propriétaire de la Base

Le catalogue système pg_class contient toutes les informations nécessaires pour faire cette opération. Il vous suffit d'exécuter une requête sur cette table en récupérant le nom de l'objet (colonne relname) après avoir fait un filtre sur le type (relkind, r pour table, i pour index, s pour séquence). N'oubliez pas de filtrer les objets systèmes (ie tous ceux dont le nom commence par pg_).

Donc, exécutez cette requête dans la fonction PL/pgsql, utilisez une boucle FOR pour récupérer ligne par ligne (donc table par table, index par index, séquence par séquence), et construisez une chaîne de requête pour exécuter le ALTER objet nom OWNER TO utilisateur.

La doc sur le pl/pgsql se trouve ici : http://docs.postgresql.fr/8.4/plpgsql.html (attention, doc de la version 8.4, adaptez l'URL suivant votre version). Les détails sur pg_class sont sur http://docs.postgresqlfr.org/8.4/catalog-pg-class.html .

Bon courage, et n'hésitez pas à poser des questions si vous êtes bloqué.


Guillaume.

Hors ligne

Pied de page des forums