Comment puis-je accorder des autorisations aux objets récemment créés dans Amazon Redshift ?

Dernière mise à jour :13-10-2022

Mon utilisateur a reçu un message d'erreur de refus d'autorisation pour un objet nouvellement créé. Comment accorder à l'utilisateur les autorisations requises pour accéder aux objets nouvellement créés dans le schéma ?

Brève description

Pour qu'un utilisateur puisse accéder aux objets nouvellement créés dans le schéma, des privilèges doivent être accordés aux objets par un superutilisateur.

Lorsqu'un utilisateur n'est pas en mesure d'accéder aux objets récemment créés dans le schéma, il peut recevoir le message d'erreur suivant :

ERROR: permission denied for relation “objectname”.

Cette erreur se produit lorsque l'accès est accordé uniquement aux objets actuels présents dans un schéma lorsque l'accès a été accordé. Par défaut, l'accès n'est pas automatiquement accordé aux futurs objets créés dans le cadre du schéma.

Pour résoudre ce problème, accordez des privilèges d'accès à l'utilisateur en utilisant la commande ALTER DEFAULT PRIVILEGES.

Solution

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

1.    Pour accorder l'accès utilisateur au schéma et l'accès SELECT à toutes les tables actuellement présentes sous 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 à SELECT l'accès à 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 utilisé pour créer les futurs objets sous le schéma, newtestschema avec le nom du schéma et newtestuser avec 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 s'appliquent uniquement aux nouveaux objets. L'exécution de ALTER DEFAULT PRIVILEGES ne modifie pas les privilèges des objets existants.

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 superutilisateur :

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 l'accès est présent, vous verrez une entrée pour l'utilisateur dans la colonne default_privileges.

Désormais, lorsque le superutilisateur crée un nouvel objet dans le schéma, il dispose d'un accès SELECT sur la table.

Exemple

L'exemple suivant commence par cette configuration :

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

Le superutilisateur, nommé awsuser, accorde l'accès à newtestuser sur le schéma newtestschema et à toutes les tables actuellement présentes sous le schéma, à l'aide de l'exemple de commande suivant :

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

La commande précédente accorde à newtestuser un accès SELECT aux tables actuelles présentes sous le newtestschema. Actuellement, seule la table newtesttable1 est présente sous le newtestschema. La table newtesttable1 est accessible à newtestuser.

Ensuite, awsuser crée une autre table nommée newtesttable2 sous le 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, l'utilisateur awsuser procède comme suit :

1.    Accorde l'accès à la table newtesttable2 en exécutant l'exemple de commande suivant :

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    Accorde l'accès à newtestuser, sur toutes les tables futures créées par awsuser sous le newtestschema, en exécutant l'exemple de commande suivant :

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

Maintenant, quand awsuser crée une autre nouvelle table nommée newtesttable3, sous le newtestschema, le newtestuser aura un accès SELECT sur newtesttable3. .

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

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;

Le résultat de la requête précédente est similaire à ce qui suit :

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

Le résultat montre qu'awsuser accorde des privilèges SELECT à newtestuser pour toutes les nouvelles tables créées par awsuser dans le newtestschema.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?