Vous n'êtes pas identifié(e).
Pages : 1
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
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
À 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
Intéressant. Va falloir que je perde mes vieux réflexes de DBA Oracle
Marc.
Hors ligne
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
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
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
En effet, l'utilisateur postgres possède des objets dont on ne peut pas le dé-posséder.
Guillaume.
Hors ligne
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
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
Pages : 1