¿Cómo puedo conceder permisos a objetos recién creados en Amazon Redshift?

4 minutos de lectura
0

Mi usuario ha recibido un error de permiso denegado para un objeto recién creado. ¿Cómo puedo conceder al usuario los permisos necesarios para acceder a los objetos recién creados en el esquema?

Descripción corta

Para que un usuario pueda acceder a los objetos recién creados en el esquema, un superusuario debe concederle privilegios.

Cuando un usuario no puede acceder a los objetos recién creados en el esquema, es posible que reciba el siguiente error:

ERROR: permission denied for relation “objectname”.

Este error se produce cuando se concede acceso solo a los objetos presentes en un esquema en el momento de conceder el acceso. De forma predeterminada, no se concede automáticamente el acceso a futuros objetos que se creen en el esquema.

Para resolver este problema, conceda privilegios de acceso al usuario mediante el comando ALTER DEFAULT PRIVILEGIES.

Resolución

Para conceder permisos para las tablas actuales y futuras del esquema, haga lo siguiente como superusuario:

1.    Para conceder el acceso de uso al esquema y el acceso SELECT en todas las tablas presentes actualmente 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;

2.    Para conceder el acceso SELECT al usuario para futuras tablas creadas en el esquema, ejecute el siguiente comando: Nota: Reemplace awsuser por el nombre de usuario que se utiliza para crear futuros objetos en el esquema, newtestschema con el nombre del esquema y newtestuser con el nombre de usuario que necesita acceso a futuros objetos.

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

Nota: Los privilegios predeterminados solo se aplican a objetos nuevos. La ejecución de ALTER DEFAULT PRIVILEGIES no modifica los privilegios de los objetos existentes.

3.    Para comprobar que se han concedido privilegios de forma predeterminada al usuario, ejecute la siguiente consulta como superusuario:

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

Si hay acceso, verá una entrada para el usuario en la columna default_privileges.

Ahora, cuando el superusuario cree un nuevo objeto en el esquema, el usuario tendrá acceso SELECT sobre la tabla.

Ejemplo

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.

El superusuario llamado awsuser concede acceso a newtestuser al esquema newtestschema y a todas las tablas presentes actualmente en el esquema, utilizando el siguiente comando de ejemplo:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

El comando anterior concede a newtestuser el acceso SELECT a las tablas actuales presentes en newtestschema. Actualmente, solo la tabla newtesttable1 está presente en el newtestschema. newtestuser puede acceder a la tabla newtesttable1.

A continuación, awsuser crea otra tabla llamada newtesttable2 en el 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 hace lo siguiente:

1.    Concede acceso a la tabla newtesttable2 ejecutando el siguiente comando de ejemplo:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    Concede acceso a newtestuser, en cualquier tabla futura que awsuser cree con el esquema newtestschema, mediante la ejecución del siguiente comando de ejemplo:

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

Ahora, cuando awsuser crea otra tabla nueva llamada newtesttable3, bajo el newtestschema, el newtestuser tendrá acceso SELECT en newtesttable3.

3.    Para comprobar que se han concedido los privilegios predeterminados a el newtestuser, el awsuser ejecuta la siguiente consulta:

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

El resultado de la consulta anterior es similar al siguiente:

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

El resultado muestra que awsuser otorga privilegios SELECT a newtestuser para todas las tablas nuevas creadas por awsuser en elnewtestschema.


Información relacionada

PG_DEFAULT_ACL

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año