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

4 minutos de lectura
0

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:

  1. 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;
  2. 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.

  3. 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:

  1. Concede acceso a la tabla newtesttable2. Para ello, awsuser ejecuta el siguiente comando de ejemplo:

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. 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.

  3. 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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un mes