Le modèle d'autorisations au niveau du schéma (SLPM) centralise la gestion des droits dans Hologres. Au lieu d'accorder individuellement des privilèges au niveau de chaque table, SLPM organise les utilisateurs dans des groupes intégrés — admin, developer, writer et viewer — et applique automatiquement les autorisations au niveau du schéma. Il suffit d'ajouter l'utilisateur au groupe approprié ; aucune instruction GRANT ou ALTER DEFAULT PRIVILEGES n'est requise.
Cette rubrique explique comment activer SLPM, gérer l'appartenance aux groupes d'utilisateurs et effectuer les opérations de cycle de vie, telles que la désactivation et la réactivation du modèle.
Limites
SLPM impose une isolation stricte au niveau du schéma. Avant de l'activer, tenez compte des points suivants :
Les vues et règles inter-schémas ne sont pas prises en charge. Si une vue ou une règle fait référence à des tables situées dans plusieurs schémas, elle devient inaccessible et renvoie l'erreur
ERROR: permission denied for table. Ne créez pas de vues ou de règles inter-schémas dans une base de données gérée par SLPM. Pour connaître l'exception disponible à partir de la version V1.3.36, consultez la section Créer des vues inter-schémas en mode SLPM (Bêta).-
Les commandes DDL standard sont remplacées par leurs équivalents SLPM. Le tableau suivant répertorie les commandes concernées.
Commande standard Raison du remplacement Équivalent SLPM alter table owner to xxToutes les tables appartiennent automatiquement au groupe developerdu schéma.Non requis. grantLes autorisations sont accordées en ajoutant les utilisateurs à des groupes. slpm_grantrevokeLes autorisations sont révoquées en retirant les utilisateurs des groupes. slpm_revokealter default privilegesLes nouvelles tables héritent automatiquement des autorisations selon le groupe de l'utilisateur. Non requis. create / drop / alter / renamesur les groupes d'utilisateurs par défautLes quatre groupes par défaut sont gérés par le système. Non applicable. rename schemaLe renommage du schéma doit passer par SLPM pour maintenir la cohérence des liaisons de groupe. slpm_rename_schemadrop databaseLes groupes d'utilisateurs doivent être nettoyés après la suppression d'une base de données. Exécutez drop database, puis appelezslpm_cleanup('<dbname>'). Les noms de compte personnalisés ne peuvent pas se terminer par
admin,developer,writer,viewerouall_users.
Activer SLPM
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un accès superutilisateur à l'instance Hologres
Un outil de développement connecté à l'instance (par exemple, HoloWeb ou psql)
Activer SLPM pour une base de données
-
Installez l'extension SLPM. Exécutez cette commande une fois par base de données.
create extension slpm; -
Activez SLPM. Assurez-vous qu'aucune instruction SQL n'est en cours d'exécution sur la base de données lorsque vous exécutez cette commande.
call slpm_enable (); -
(Facultatif) Migrer depuis le modèle d'autorisations PostgreSQL standard. Si la base de données contient déjà des tables, des vues ou des tables externes gérées selon le modèle PostgreSQL standard, migrez la propriété des objets existants vers SLPM à l'aide de la commande suivante.
Connectez-vous à la console Hologres. Dans le volet de navigation de gauche, cliquez sur Go to HoloWeb.
Cliquez sur Security Center. Sur la page DB Authorization, vérifiez le modèle d'autorisation actuel.
La fonction
slpm_migratetraite jusqu'à 64 utilisateurs par exécution (paramètre ajustable). Si la base de données compte plus d'utilisateurs, exécutez la fonction plusieurs fois jusqu'à ce que toutes les autorisations soient migrées. Pour plus de détails sur les paramètres, consultez slpm_migrate.-- Transfer ownership of existing objects to the developer group for SLPM management. call slpm_migrate ();Pour vérifier quel modèle d'autorisation est actif avant la migration :
Accorder des autorisations
Les autorisations SLPM sont accordées en ajoutant des utilisateurs à des groupes. Chaque groupe correspond à un schéma et à un niveau d'autorisation :
| Groupe | Format | Autorisations |
|---|---|---|
admin |
{dbname}.admin |
Administration de la base de données |
developer |
{dbname}.{schemaname}.developer |
Lecture et écriture, DDL |
writer |
{dbname}.{schemaname}.writer |
Lecture et écriture |
viewer |
{dbname}.{schemaname}.viewer |
Lecture seule |
Pour obtenir des détails complets sur les actions possibles pour chaque groupe, consultez Groupes d'utilisateurs.
Étape 1 : Créer l'utilisateur
Ignorez cette étape si l'utilisateur existe déjà dans l'instance.
-- Create a user.
call slpm_create_user('<account>');
-- Create a user and add them to a group in one step.
call slpm_create_user('<account>', '{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]');
Remplacez <account> par l'un des formats suivants :
| Type de compte | Format | Exemple |
|---|---|---|
| ID de compte Alibaba Cloud | ID numérique | 197006222995xxx |
| Adresse e-mail Alibaba Cloud | ALIYUN$xxx ou "xxx@aliyun.com" (entre guillemets doubles) |
"xxx@aliyun.com" |
| Utilisateur RAM | RAM$mainaccount:subuser |
RAM$mycompany:alice |
| UID d'utilisateur RAM | p4_UID |
p4_564306222995xxx |
Pour utiliser un UID d'utilisateur RAM, ajoutez le préfixe p4_. Obtenez l'UID depuis la page Users de la console RAM. Pour en savoir plus sur les formats de compte, consultez Système de comptes.
Étape 2 : Ajouter l'utilisateur à un groupe
call slpm_grant('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<account>');
Si vous avez déjà ajouté l'utilisateur à un groupe lors de sa création, ignorez cette étape.
Exemples :
L'exemple suivant ajoute un compte Alibaba Cloud au groupe admin de mydb.
call slpm_grant('mydb.admin', '197006222995xxx');
call slpm_grant('mydb.admin', 'ALIYUN$xxx');
L'exemple suivant ajoute des utilisateurs au groupe developer du schéma public dans mydb.
call slpm_grant('mydb.public.developer', '197006222995xxx');
call slpm_grant('mydb.public.developer', 'RAM$mainaccount:subuser');
L'exemple suivant ajoute un utilisateur au groupe viewer du schéma lisa dans MYDB (nom de base de données sensible à la casse).
call slpm_grant('"MYDB.lisa.viewer"', '197006222995xxx');
call slpm_grant('mydb.lisa.viewer', '"xxx@aliyun.com"');
Retirer un utilisateur d'un groupe
Le retrait d'un utilisateur d'un groupe révoque toutes les autorisations associées à ce groupe.
call slpm_revoke('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<account>');
Exemples :
L'exemple suivant retire des utilisateurs du groupe admin de dbname.
call slpm_revoke('dbname.admin', 'p4_564306222995xxx');
call slpm_revoke('dbname.admin', '197006222995xxx');
call slpm_revoke('dbname.admin', '"xxx@aliyun.com"');
L'exemple suivant retire un utilisateur RAM du groupe developer du schéma lisa dans mydb.
call slpm_revoke('mydb.lisa.developer', 'RAM$mainaccount:subuser');
call slpm_revoke('mydb.public.developer', 'p4_564306222995xxx');
L'exemple suivant retire un utilisateur RAM du groupe viewer de SCHEMA1 dans MYDB (noms sensibles à la casse).
call slpm_revoke('"MYDB.SCHEMA1.viewer"', 'p4_564306222995xxx');
Supprimer un utilisateur
La suppression d'un utilisateur le retire de l'instance et révoque toutes les autorisations au niveau de l'instance. Cette action est irréversible.
DROP ROLE "<account>";
Désactiver SLPM
Étape 1 : Désactiver le modèle
Seul un superutilisateur peut désactiver SLPM.
call slpm_disable ();
Après la désactivation :
Les quatre groupes d'utilisateurs (
{db}.admin,{db}.{schemaname}.developer,{db}.{schemaname}.writer,{db}.{schemaname}.viewer) conservent leurs autorisations sur les objets existants. Les autorisations ne s'étendent pas aux nouveaux objets.PUBLIC reçoit les autorisations suivantes :
USAGEetCREATEsur le schéma public ;CONNECTetTEMPORARYsur la base de données ;EXECUTEsur les fonctions et procédures ;USAGEsur les langages et types de données (y compris les domaines).PUBLIC ne reçoit pas d'autorisations sur les tables, vues, vues matérialisées, colonnes de table, séquences, wrappers de données distantes, serveurs distants ou schémas non publics. Contactez un superutilisateur pour accorder ces autorisations individuellement.
Étape 2 : Nettoyer les groupes d'utilisateurs (facultatif)
Les groupes d'utilisateurs ne sont pas supprimés automatiquement lors de la désactivation de SLPM. Pour les supprimer, appelez slpm_cleanup.
Assurez-vous qu'aucune instruction SQL n'est en cours d'exécution sur la base de données avant d'appelerslpm_cleanup. La fonctionslpm_cleanuptransfère la propriété des objets par lots de 64 (paramètre ajustable). Exécutez-la plusieurs fois si nécessaire, mais évitez de dépasser cinq exécutions. Pour plus de détails, consultez slpm_cleanup.
Scénario 1 : Supprimer les groupes d'utilisateurs tout en conservant la base de données.
Exécutez la commande suivante dans la base de données cible en tant que superutilisateur.
call slpm_cleanup('<dbname>');
Scénario 2 : Supprimer les groupes d'utilisateurs après la suppression de la base de données.
Exécutez la commande suivante dans une autre base de données (telle que postgres) en tant que superutilisateur.
call slpm_cleanup('mydb');
Réactiver SLPM
-
Effacez les autorisations existantes pour éviter les conflits.
call slpm_cleanup ( '<dbname>' ); -
Réactivez SLPM en mode récupération, puis transférez la propriété des objets.
-- Enable SLPM in recovery mode. call slpm_enable ('t'); -- Transfer ownership of existing objects to the developer group. call slpm_migrate (); Accordez des autorisations aux utilisateurs. Utilisez
slpm_grantcomme décrit dans Accorder des autorisations, ou utilisez la console Hologres. Pour plus de détails, consultez Accorder des autorisations à un utilisateur.
Créer des vues inter-schémas en mode SLPM (Bêta)
Les vues inter-schémas nécessitent Hologres V1.3.36 ou une version ultérieure. Si votre instance utilise une version antérieure, consultez Erreurs courantes lors de la préparation d'une mise à niveau d'instance ou contactez le support via le support en ligne.
Par défaut, SLPM n'autorise pas les vues qui font référence à des tables situées dans plusieurs schémas. La fonctionnalité de vue inter-schémas lève cette restriction pour des cas d'utilisation spécifiques.
Quand utiliser cette fonctionnalité
Un modèle courant d'entrepôt de données consiste à organiser les données en schémas stratifiés, par exemple ODS (Operation Data Store), DWD, DWS (Data Warehouse Service) et ADS, puis à créer des vues récapitulatives dans une couche externe qui joignent des tables provenant de plusieurs couches internes.
Prenons l'exemple suivant où une vue dans le schéma ads joint des tables de ods et de dwd :
| Base de données | Schéma | Objet |
|---|---|---|
erp_db |
ods |
Table : orders |
erp_db |
dwd |
Table : customer |
erp_db |
ads |
Vue : customer_total_order_price_view |
La DDL de la vue :
CREATE VIEW ads.customer_total_order_price_view AS
SELECT
c_name,
sum(o_totalprice)
FROM
ods.orders AS o
INNER JOIN dwd.customer AS c
ON o.o_custkey = c.c_custkey
GROUP BY
1;
Conditions d'autorisation
| Action | Autorisations requises |
|---|---|
Créer une vue inter-schémas dans le schéma ads |
developer sur ads, plus viewer ou supérieur sur toutes les tables utilisées dans la vue |
| Interroger une vue inter-schémas | viewer ou supérieur sur le schéma où réside la vue |
| Modifier ou supprimer une vue inter-schémas | Doit être le propriétaire de la vue |
Dans l'exemple ci-dessus, pour créer ads.customer_total_order_price_view en tant que ads_dev_user :
Accordez à
ads_dev_userl'autorisationdevelopersurads.Accordez à
ads_dev_userl'autorisationviewersurodsetdwd.
Pour permettre à ads_view_user d'interroger la vue, accordez à ads_view_user l'autorisation viewer sur ads.
Activer la fonctionnalité de vue inter-schémas
Exécutez la commande suivante en tant que superutilisateur.
call slpm_enable_multi_schema_view();
Transférer la propriété de la vue
Une fois la fonctionnalité activée, l'utilisateur qui crée une vue en devient le propriétaire. Seul le propriétaire peut la modifier ou la supprimer. Pour transférer la propriété, par exemple avant de retirer un utilisateur de la base de données, exécutez la commande suivante. Le nouveau propriétaire doit disposer de l'autorisation developer sur le schéma de la vue et de l'autorisation viewer ou supérieure sur tous les schémas source.
-- Syntax
call slpm_alter_view_owner('view_name', '<account>');
-- Example: transfer ownership of ads.customer_total_order_price_view to p4_xxxxx.
call slpm_alter_view_owner('ads.customer_total_order_price_view', 'p4_xxxxx');
Désactiver la fonctionnalité de vue inter-schémas
-- Disable cross-schema view support.
call slpm_disable_multi_schema_view();
-- Transfer all view ownership back to the developer group of each view's schema.
call slpm_migrate();
Après l'exécution de ces commandes, les vues existantes non inter-schémas restent interrogeables et SLPM se comporte normalement. Les vues inter-schémas ne peuvent plus être interrogées.
Étapes suivantes
Fonctions du modèle d'autorisations au niveau du schéma — Référence complète de toutes les fonctions SLPM, y compris les détails des paramètres
Aperçu du modèle d'autorisations au niveau du schéma — Tableau de référence des autorisations des groupes d'utilisateurs