Tengo dos tablas. Uno tiene una clave externa que hace referencia a un campo serie en la otra tabla. He otorgado el privilegio INSERTAR a una función que no sea el propietario, pero todavía no puedo insertarla en la tabla que contiene la clave externa a menos que conceda al propietario de la tabla el privilegio ACTUALIZAR en la tabla que contiene el campo al que se hace referencia. No entiendo por qué el propietario necesita tener permiso de ACTUALIZACIÓN para otro rol distinto (con privilegio INSERT) para poder insertar una fila en este caso.permisos: ¿por qué el propietario de la tabla necesita ACTUALIZAR en este caso?
Esto es un poco confuso, así que he proporcionado un ejemplo reducido de mi problema.
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"
Sin embargo, la inserción anterior funciona si doy vuelta testowner el privilegio UPDATE (GRANT UPDATE ON a TO testowner;
). ¿Por qué necesita testowner ACTUALIZAR en este caso?
NOTA: GRANT UPDATE ON a TO testupdater;
no ayuda; parece que tengo que OTORGAR ACTUALIZACIÓN al rol de tesorero.
¿Funciona si le das permiso de lectura al usuario en testowner? Una inserción en testupdater deberá leer los valores de la clave externa en testowner para asegurarse de que la inserción sea válida. –
@Macy Nunca revoqué el permiso SELECT de la función 'testowner'. 'testupdater' también recibió permiso SELECT, por lo que parece que debería poder leer la tabla' a' para verificar la referencia. –
Funciona bien aquí, sin errores inesperados. –