Version rapide:
Quelle commande dois-je émettre pour permettre à un propriétaire de base de données de lui permettre d'accéder aux tables de cette base de données et cela peut-il être fait à partir du compte de ce propriétaire?
Version plus longue:
Je crée une base de données sur RDS. J'ai un utilisateur «root» que j'ai configuré avec Amazon.
Amazon crée automatiquement le rôle de groupe «rds_superuser» qui est très privilégié, mais pas en fait un superutilisateur.
Je crée une base de données et un utilisateur pour l'application comme suit:
create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;
\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;
J'ai mis à jour ce script pour refléter les suggestions de Craig Ringer sur la façon dont je devrais gérer cela.
Lorsque l'application se connecte (avec les informations d'identification master_application), elle crée (et possède donc) les tables.
Mon problème est que je ne peux pas utiliser ma connexion administrative (rootish) pour exécuter des requêtes car cet utilisateur n'a aucun privilège sur la table.
J'ai pu résoudre ce problème auparavant en exécutant ce qui suit à partir du compte d'application:
GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
Mais il semble bizarre qu'un utilisateur subalterne redonne des privilèges à un utilisateur administratif.
Alors ... Y a-t-il une commande que je peux exécuter avant ou après avoir créé les tables à partir de l'application qui garantira que le propriétaire de la base de données peut accéder aux tables dans la base de données?
mettre à jour après avoir réessayé les privilèges alter default ...
Cela n'accorde toujours pas l'accès aux tables; Je vois que cela est suggéré ailleurs et c'est tout à fait logique, mais cela ne fonctionne pas pour moi. Depuis un shell psql:
master_integration=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
------------------+--------+-------+-------------------------------------------
integration_root | | table | integration_root=arwdDxt/integration_root+
| | | rds_superuser=arwdDxt/integration_root
(1 row)
master_integration=> \dp users
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-------+-------+-------------------+--------------------------
public | users | table | |
(1 row)
integration_root est mon utilisateur superutilisateur et is users est une table dans ma base de données.
Mise à jour
J'ai reçu une réponse assez inutile de quelqu'un d'Amazon.
Ils m'ont demandé d'appeler ALTER DEFAULT PRIVILEGES à partir de la connexion master_application. Bien que cela fonctionnerait probablement, cela ne répondrait pas à ma question (comment faire pour que cela se produise uniquement à partir du compte rds_superuser).
Je leur ai demandé de clarifier cela et ils sont partis.