J'ai deux tables. On a une clé étrangère référençant un champ série dans l'autre table. J'ai accordé le privilège INSERT à un rôle autre que le propriétaire, mais je ne peux toujours pas insérer dans la table contenant la clé étrangère à moins que j'accorde le propriétaire du privilège UPDATE de table sur la table contenant le champ référencé. Je ne comprends pas très bien pourquoi le propriétaire a besoin de l'autorisation UPDATE pour qu'un autre rôle distinct (avec le privilège INSERT) puisse insérer une ligne dans ce cas.autorisations: pourquoi UPDATE est-il nécessaire au propriétaire de la table dans ce cas?
Ceci est un peu déroutant, donc j'ai fourni un exemple réduit de mon problème.
createuser -U postgres testowner -DIRS --pwprompt
createdb -U postgres -O testowner testdb
createuser -U postgres testupdater -DIRS --pwprompt
psql -d testdb -U testowner
CREATE TABLE a (id serial PRIMARY KEY);
CREATE TABLE b (a_id integer REFERENCES a(id));
GRANT SELECT,INSERT ON ALL TABLES IN SCHEMA public TO testupdater;
GRANT USAGE,UPDATE ON SEQUENCE a_id_seq TO testupdater;
REVOKE INSERT, UPDATE ON ALL TABLES IN SCHEMA public FROM testowner;
INSERT INTO a VALUES (DEFAULT); -- as expected: ERROR: permission denied for relation a
\q
psql -d testdb -U testupdater
INSERT INTO a VALUES (DEFAULT);
SELECT id FROM a LIMIT 1; -- selects the first id (1)
INSERT INTO b VALUES (1); -- unexpected error: see below
\q
ERROR: permission denied for relation a
CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."a" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
Cependant, l'insert ci-dessus fonctionne si je donne le privilège testowner retour UPDATE (GRANT UPDATE ON a TO testowner;
). Pourquoi le testowner a-t-il besoin de UPDATE dans ce cas?
REMARQUE: GRANT UPDATE ON a TO testupdater;
n'aide pas; il semble que je doive accorder la mise à jour au rôle de testowner.
Est-ce que cela fonctionne si vous autorisez l'utilisateur à lire le testowner? Un insert sur testupdater devra lire les valeurs de la clé étrangère dans testowner pour s'assurer que l'insert est valide. –
@Macy Je n'ai jamais révoqué l'autorisation SELECT du rôle 'testowner'. 'testupdater' a également reçu l'autorisation SELECT, il semble donc qu'il devrait être capable de lire la table' a' pour vérifier la référence. –
Cela fonctionne très bien ici, pas d'erreurs inattendues. –