Comment puis-je accorder des autorisations à de nouveaux objets créés dans Amazon Redshift ?

Lecture de 5 minute(s)
0

Mon utilisateur a reçu une erreur de refus d'autorisation pour un objet récemment créé. Comment puis-je accorder à l'utilisateur les autorisations nécessaires pour accéder aux objets récemment créés dans le schéma ?

Brève description

Les utilisateurs qui souhaitent accéder aux objets récemment créés dans le schéma doivent disposer de privilèges d'accès accordés par le propriétaire de l'objet ou par un super-utilisateur.

Lorsqu'un utilisateur ne peut pas accéder aux objets récemment créés dans le schéma, il peut recevoir l'erreur suivante :

« ERROR: permission denied for relation 'objectname' »

Cette erreur se produit lorsque l'accès est accordé uniquement aux objets présents dans un schéma lors de l’octroi initial de l’accès. Par défaut, l'accès n'est pas automatiquement accordé aux objets créés selon le schéma actuel.

Pour résoudre ce problème, accordez des privilèges d'accès à l'utilisateur ou par le biais de rôles de groupe. Utilisez la commande ALTER DEFAULT PRIVILEGES.

Résolution

Pour accorder des autorisations pour les tables actuelles et futures du schéma, procédez comme suit en tant que super-utilisateur :

  1. Pour accorder l'accès d'utilisation au schéma et l'accès SELECT à toutes les tables actuellement présentes dans le schéma, exécutez les commandes suivantes :
    Remarque : Remplacez newtestschema par le nom de votre schéma et newtestuser par le nom de l'utilisateur.

    grant usage on schema newtestschema to newtestuser;
    grant select on all tables in schema newtestschema to newtestuser;
  2. Pour accorder l'accès SELECT à l'utilisateur pour les futures tables créées selon le schéma, exécutez la commande suivante :
    Remarque : Remplacez awsuser par le nom d'utilisateur qui sera utilisé pour créer de futurs objets selon le schéma. Puis, remplacez newtestschema par le nom du schéma et newtestuser par le nom d'utilisateur qui doit accéder aux futurs objets.

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

    Remarque : Les privilèges par défaut ne s'appliquent qu'aux nouveaux objets. Lorsque vous exécutez la commande ALTER DEFAULT PRIVILEGES, les privilèges sur les objets existants ne sont pas modifiés.

  3. Pour vérifier que les privilèges par défaut ont été accordés à l'utilisateur, exécutez la requête suivante en tant que super-utilisateur :

    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';

    Pour vérifier les autorisations accordées directement à l'utilisateur, exécutez la requête suivante en tant que super-utilisateur :

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

Exemple de résolution

L'exemple suivant commence par cette configuration :

  • Un utilisateur nommé newtestuser qui n'est pas un super-utilisateur.
  • Un schéma nommé newtestschema et une table nommée newtesttable1 dans le schéma avec quelques enregistrements.

Un super-utilisateur nommé awsuser donne accès à newtestuser sur le schéma newtestschema et sur toutes les tables actuellement présentes dans le schéma. Pour accorder l'accès, awsuser utilise l'exemple de commande suivant :

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

La commande accorde à newtestuser l’accès SELECT aux tables actuelles présentes sous newtestschema. Actuellement, seule la table newtesttable1 est présente dans le schéma newtestschema. Par conséquent, la table newtesttable1 est accessible à newtestuser.

Puis, awsuser crée une autre table nommée newtesttable2 dans le schéma newtestschema. Si newtestuser exécute une requête SELECT sur la table newtestschema.newtesttable2, l'erreur suivante s'affiche :

ERROR: permission denied for relation newtesttable2.

Pour résoudre l'erreur, awsuser effectue les étapes suivantes :

  1. Accorde l’accès à la table newtesttable2. Pour ce faire, awsuser exécute l'exemple de commande suivant :

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. Accorde l'accès à newtestuser pour toutes les futures tables créées par awsuser dans le schéma newtestschema. Pour ce faire, awsuser exécute l'exemple de commande suivant :

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

    Lorsque awsuser crée une autre nouvelle table nommée newtesttable3 dans le schéma newtestschema, newtestuser accorde l’accès SELECT à la table newtesttable3.

  3. Pour vérifier que les privilèges par défaut ont été accordés à newtestuser, awsuser exécute la requête suivante :

    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';

    Pour vérifier les autorisations accordées directement à newtestuser, awsuser exécute la requête suivante :

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    La sortie montre que awsuser accorde les privilèges SELECT à newtestuser pour toutes les nouvelles tables créées par awsuser dans le schéma 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

Informations connexes

PG_DEFAULT_ACL

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois