Je vais partager avec vous un petit truc qui m'a été utile aujourd'hui car j'ai passé une partie de la journée à faire du débogage à distance et comme je n'avais pas accès à psql, j'ai dû me débrouiller avec ce que j'avais sous la main.
Le client avait un problème de droits d'accès sur certains objects de sa base de données PostgreSQL. J'ai suspecté qu'il avait dû créer des nouveaux objets avec le user postgres plutôt qu'avec l'utilisateur de son projet (l'utilisateur connecté qui crée les objets possède automatiquement les droits sur ceux-ci, donc pas besoin d'attribuer des droits manuellement).
L'objectif : comment savoir quels objets sont problématiques à l'aide d'une requête SQL qui interroge les tables systèmes ?
Pour savoir qui est le propriétaire d'une table en particulier :
SELECT tableownerPour voir la liste des tables et le propriétaire de chacune :
FROM pg_catalog.pg_tables
WHERE tablename = 'nom_de_la_table'
SELECT tablename, tableownerPour modifier le propriétaire d'une table :
FROM pg_catalog.pg_tables
ORDER BY tablename
ALTER TABLE tablename OWNER TO usernameConnecté en tant que l'utilisateur postgres, on peut obtenir la liste des bases de données et leurs propriétaires respectifs :
SELECT datname, rolnameOn peut changer le propriétaire de la base de données :
FROM pg_database as d
INNER JOIN pg_authid as a ON d.datdba = a.oid
ORDER BY datname
ALTER DATABASE dbname OWNER TO usernameCependant, il faut savoir que les objects conservent le propriétaire original. Si on veut changer tous les objets de propriétaire, il faudra les changer un par un. Mieux vaut faire un script qui boucle sur l'ensemble des objets.