Création d'objets dans les schémas
Généralités sur les créations d'objets⚓
La création d’objets dans les schémas se fait selon les possibilités habituelles (création directe en SQL, import/export, COPY
, etc.). Si le schéma cible est référencé dans sa table de gestion[1], ASGARD se contente d’intercepter les commandes de création pour réaffecter la propriété des nouveaux objets au rôle de groupe producteur[2] du schéma et, lorsqu’il y a lieu, attribuer les droits standards de l’éditeur[3] et du lecteur[4] désignés pour le schéma.
Exemple :
Lorsque jon.snow
, membre de g_snum
, crée la table journal_du_mur
dans le schéma w_snow
dont g_snum
est le producteur et public
le lecteur, g_snum
devient automatiquement propriétaire de la table et les droits de lecture usuels sont conférés à public
:
CREATE TABLE w_snow.journal_du_mur (
id serial PRIMARY KEY,
jour date,
entree text
) ;
NOTICE: réattribution de la propriété de w_snow.journal_du_mur au rôle producteur du schéma :
NOTICE: > ALTER table w_snow.journal_du_mur OWNER TO g_snum
NOTICE: application des privilèges standards pour le rôle lecteur du schéma :
NOTICE: > GRANT SELECT ON TABLE w_snow.journal_du_mur TO public
NOTICE: application des privilèges standards pour le rôle lecteur du schéma :
NOTICE: > GRANT SELECT ON SEQUENCE w_snow.journal_du_mur_id_seq TO public
CREATE TABLE
Cas particulier des vues et vues matérialisées⚓
Dans le cas des vues et vues matérialisées, PostgreSQL considère à la fois les droits de l’utilisateur courant sur la vue et les droits du propriétaire de la vue sur les tables ou vues sources pour déterminer les actions possibles.
Dès la création de la vue ou vue matérialisée, il importe donc de penser à attribuer les droits nécessaires à son propriétaire – c’est-à-dire au rôle producteur[2] pour son schéma.
Conseil :
Lors de la création d'une vue ou d'une vue matérialisée, vérifier que le producteur de son schéma dispose des droits requis sur les tables sources, sans quoi elle sera inutilisable.
La question se pose uniquement si certaines sources ne sont pas localisées dans le même schéma que la vue. Dans le cas contraire le producteur du schéma est à la fois le propriétaire de la vue et des tables/vues sources, sur lesquelles il dispose naturellement de droits suffisants.
Concrètement, il est nécessaire que le producteur du schéma d’une vue matérialisée soit a minima membre des groupes lecteurs[4] de tous les schémas contenant ses tables sources pour qu’un utilisateur puisse la rafraîchir avec REFRESH MATERIALIZED VIEW
. Le strict minimum requis est que le rôle propriétaire de la vue matérialisée (c'est-à-dire le producteur de son schéma), dispose du privilège SELECT
sur chacune des tables ou vues sources. Le privilège USAGE
sur le schéma que confère l’appartenance au rôle lecteur n’est pas rigoureusement nécessaire. L’utilisateur qui lance la commande de rafraîchissement devra pour sa part être membre du rôle producteur du schéma contenant la vue matérialisée.
Dans le même esprit, pour qu’il soit possible de consulter les données d’une vue non matérialisée, l’utilisateur doit appartenir a minima au groupe lecteur du schéma de la vue et le producteur de ce schéma doit appartenir a minima aux groupes lecteurs de tous les schémas contenant les tables sources de la vue. Là encore, le strict minimum requis est que le rôle propriétaire de la vue, soit le producteur de son schéma, dispose du privilège SELECT
sur chacune des tables ou vues sources. Le privilège USAGE
sur le schéma que confère l’appartenance au rôle lecteur n’est pas rigoureusement nécessaire.
Pour modifier des données via une vue modifiable, le producteur du schéma de la vue doit être membre de l’éditeur[3] du schéma contenant la table source et l’utilisateur être membre de l’éditeur du schéma de la vue.
action | droits de l’utilisateur | droits du producteur du schéma |
---|---|---|
rafraîchir une vue matérialisée | producteur du schéma de la vue matérialisée | lecteur, éditeur ou producteur des schémas contenant les sources de la vue matérialisée |
consulter les données d’une vue matérialisée | lecteur, éditeur ou producteur du schéma de la vue matérialisée | néant |
consulter les données d’une vue | lecteur, éditeur ou producteur du schéma de la vue | lecteur, éditeur ou producteur des schémas contenant les sources de la vue |
éditer une vue modifiable | éditeur ou producteur du schéma de la vue | éditeur ou producteur du schéma de la table source |
éditer une vue avec déclencheur | éditeur ou producteur du schéma de la vue et éditeur ou producteur des schémas des tables sur lesquelles sont répercutées les modifications | néant |
La fonction de diagnostic saura repérer les vues et vues matérialisées pour lesquelles le producteur du schéma n’est pas même lecteur des données sources.
Lors de la création d’une vue ou vue matérialisée, ASGARD avertira l’utilisateur si les privilèges du producteur sont insuffisants (uniquement pour les droits de lecture, les vues modifiables non modifiables à cause de droits d'édition manquants ne sont pas signalées).
Exemple :
Création d’une vue ma_vue
dans le schéma c_bibliotheque
, interrogeant la table ma_table
du schéma c_librairie
. Le producteur de c_bibliotheque
, g_asgard_2
ne dispose encore d’aucun droit sur ma_table
.
ASGARD renvoie un avertissement et encourage à rendre le producteur de c_bibliotheque
membre du rôle g_consult
, lecteur du schéma c_librairie
:
ATTENTION: Le producteur du schéma de la vue c_bibliotheque.ma_vue ne dispose pas des droits nécessaires pour accéder à ses données sources.
DETAIL: Table source c_librairie.ma_table, producteur g_asgard_1, éditeur non défini, lecteur g_consult.
HINT: Pour rendre le producteur de la vue membre du rôle lecteur du schéma source, vous pouvez lancer la commande suivante : GRANT g_consult TO g_asgard_2.
À noter que le message d'avertissement pourra être moins détaillé (pas d'informations sur les lecteur et éditeur) si l'utilisateur n'est pas membre du rôle producteur du schéma contenant les sources.
Complément : Voir aussi⚓
Modifier les privilèges pour la désignation du lecteur ou de l'éditeur d'un schéma.