Mi usuario recibió un error de denegación de permiso para un objeto recién creado. ¿Cómo concedo al usuario los permisos necesarios para acceder a los objetos recién creados en el esquema?
Descripción corta
Los usuarios que desean acceder a los objetos recién creados en el esquema deben tener privilegios de acceso concedidos por el propietario del objeto o un superusuario.
Cuando un usuario no puede acceder a los objetos recién creados en el esquema, es posible que reciba el siguiente error:
«ERROR: permiso denegado para la relación 'objectname'»
Este error se produce cuando se concede el acceso solo a los objetos presentes en un esquema cuando se concedió el acceso por primera vez. De forma predeterminada, el acceso no se concede automáticamente a los objetos que se crean en el esquema actual.
Para resolver este problema, conceda privilegios de acceso al usuario o mediante roles de grupo. Utilice el comando ALTER DEFAULT PRIVILEGES.
Resolución
Para conceder permisos para las tablas actuales y futuras del esquema, haga lo siguiente como superusuario:
-
Para conceder acceso de uso en el esquema y acceso SELECT en todas las tablas actualmente presentes en el esquema, ejecute los siguientes comandos:
Nota: Sustituya newtestschema por el nombre de su esquema y newtestuser por el nombre del usuario.
grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;
-
Para conceder acceso SELECT al usuario para las tablas futuras que se creen en el esquema, ejecute el siguiente comando:
Nota: Sustituya awsuser por el nombre de usuario que se utilizará para crear objetos futuros en el esquema. A continuación, sustituya newtestschema por el nombre del esquema y newtestuser por el nombre de usuario que necesita acceder a los objetos futuros.
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
Nota: Los privilegios predeterminados se aplican solo a los objetos nuevos. Al ejecutar el comando ALTER DEFAULT PRIVILEGES, los privilegios de los objetos existentes no cambian.
-
Para comprobar que se concedieron los privilegios predeterminados al usuario, ejecute la siguiente consulta como superusuario:
select * from svv_default_privileges where grantee_name = 'newtestuser';
select * from svv_default_privileges where schema_name = 'newtestschema';
select * from svv_default_privileges where grantee_type = 'role';
Para revisar los permisos concedidos directamente al usuario, ejecute la siguiente consulta como superusuario:
SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';
Ejemplo de resolución
El siguiente ejemplo comienza con esta configuración:
- Un usuario llamado newtestuser que no es un superusuario.
- Un esquema denominado newtestschema y una tabla denominada newtesttable1 en el esquema con algunos registros.
Un superusuario llamado awsuser concede acceso a newtestuser en el esquema newtestschema y en todas las tablas presentes actualmente en el esquema. Para conceder acceso, awsuser usa el siguiente comando de ejemplo:
grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;
El comando concede a newtestuser acceso SELECT a las tablas actuales presentes en el esquema newtestschema. Actualmente, solo la tabla newtesttable1 está presente en el esquema newtestschema. Como resultado, newtesttable1 puede acceder a la tabla newtestuser.
A continuación, awsuser crea otra tabla denominada newtesttable2 en newtestschema. Si newtestuser ejecuta una consulta SELECT en la tabla newtestschema.newtesttable2, aparece el siguiente error:
ERROR: permission denied for relation newtesttable2.
Para resolver el error, awsuser realiza los siguientes pasos:
-
Concede acceso a la tabla newtesttable2. Para ello, awsuser ejecuta el siguiente comando de ejemplo:
grant select on table newtestschema.newtesttable2 to newtestuser;
-
Concede acceso a newtestuser para cualquier tabla futura que awsuser cree bajo el esquema newtestschema. Para ello, awsuser ejecuta el siguiente comando de ejemplo:
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
Ahora, cuando awsuser cree otra tabla nueva denominada newtesttable3 en newtestschema, newtestuser tendrá acceso SELECT a la tabla newtesttable3.
-
Para comprobar que los privilegios predeterminados se concedieron a newtestuser, awsuser ejecuta la siguiente consulta:
select * from svv_default_privileges where grantee_name = 'newtestuser';
select * from svv_default_privileges where schema_name = 'newtestschema';
select * from svv_default_privileges where grantee_type = 'role';
Para revisar los permisos concedidos directamente a newtestuser, awsuser ejecuta la siguiente consulta:
SELECT * from svv_relation_privileges where identity_name = 'newtestuser';
El resultado muestra que awsuser concede privilegios SELECT a newtestuser para todas las tablas nuevas creadas por awsuser en newtestschema.
schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE
Información relacionada
PG_DEFAULT_ACL