asgard_deplace_obj

fonction de déplacement d'objet

z_asgard.asgard_deplace_obj(obj_schema text, obj_nom text, obj_typ text, schema_cible text [, variante integer DEFAULT 1 ] )

La fonction asgard_deplace_obj permet de déplacer un objet vers un nouveau schéma en spécifiant la gestion voulue sur les droits de l’objet : transfert ou réinitialisation plus ou moins complète des privilèges.

C'est un outil essentiel pour les tables et assimilées, ou encore les séquences, pour lesquelles un déplacement par la commande ALTER [OBJET] … SET SCHEMA ne produira presque jamais le résultat escompté sur les droits.

Pour les fonctions, agrégats, procédures (sous PostgreSQL 11 ou supérieur), types et domaines, sur lesquels ASGARD n’accorde pas de privilège spécifique aux lecteurs et éditeurs, la plus-value est beaucoup plus réduite et, sauf à vouloir déplacer l’objet et réinitialiser les droits en une seule commande (avec la variante n°2, cf. ci-après), une commande SQL classique sera souvent tout aussi efficace.

Si l’objet est une table avec un ou plusieurs champs serial ou IDENDITY (à partir de PostgreSQL 10), les privilèges sur les séquences associées seront traités selon les mêmes modalités que ceux de la table. PostgreSQL adapte déjà automatiquement leur schéma et leur propriétaire selon ceux de la table dont elles dépendent, la fonction asgard_deplace_obj reproduit cette mécanique avec les privilèges.

Les autres objets qui seraient liés à l’objet déplacé ne sont pas considérés pour l’heure : les privilèges de l’ancien propriétaire seront transférés sur le nouveau et tous les autres privilèges resteront inchangés.

Remarque

La fonction vérifie qu'il n'existe pas déjà dans le schéma d'arrivée un objet de même nom que l'objet à transférer, et renvoie une erreur le cas échéant. Pour une table, le contrôle porte également sur les éventuelles séquences et index qui lui sont liés, puisqu'ils changeront eux aussi de schéma.

Schéma

z_asgard

La fonction peut être utilisée par tout utilisateur membre à la fois du rôle producteur du schéma de départ et rôle producteur du schéma d'arrivée.

Syntaxe avec des arguments positionnels

SELECT z_asgard.asgard_deplace_obj('%obj_schema', '%obj_nom', '%obj_typ', '%schema_cible' [, %variante ] ) ;

Les arguments doivent être spécifiés dans l’ordre. Les arguments optionnels peuvent être omis, mais seulement s’ils sont à la fin de la liste.

Syntaxe avec des arguments nommés

SELECT z_asgard.asgard_deplace_obj(obj_schema := '%obj_schema', obj_nom := '%obj_nom', obj_typ := '%obj_typ', schema_cible := '%schema_cible' [, variante := %variante ] ) ;

L’ordre des arguments nommés n’a pas d’importance. Les arguments optionnels peuvent être omis.

Il est bien entendu possible de commencer avec des arguments positionnels (dans l’ordre) et terminer par des arguments nommés.

Arguments

  1. obj_schema est une chaîne de caractères correspondant au nom du schéma contenant l’objet à déplacer ;

  2. obj_nom est une chaîne de caractères correspondant au nom de l’objet ;

  3. obj_typ est une chaîne de caractères correspondant au type de l’objet ;

  4. schema_cible est une chaîne de caractères correspondant au nom du schéma où doit être déplacé l’objet ;

  5. [optionnel] variante est un nombre entier compris entre 1 et 6, qui définit le comportement attendu par l’utilisateur vis-à-vis des privilèges. Valeur par défaut 1.

Pour obj_typ, les valeurs acceptées sont :

table

partitioned table

view

materialized view

foreign table

sequence

function

aggregate

procedure

routine

type

domain

En pratique, « partitioned table » sera assimilé à « table » et peut être directement écrit comme tel.

Pour les versions antérieures à PostgreSQL 11, dans lesquelles les procédures et routines ne sont pas des objets PostgreSQL à proprement parler, les types « function », « aggregate », « procedure » et « routine » sont équivalent à « function ». Sous PostgreSQL 11 et supérieur, ils sont synonymes de « routine », mot-clé accepté par PostgreSQL pour les commandes portant indifféremment sur des fonctions (agrégats compris) ou des procédures.

Les valeurs de obj_schema et schema_cible s’écrivent sans les guillemets doubles nécessaires aux identifiants des commandes SQL, même s’il s’agit de noms non normalisés. Par exemple, on veillera bien à indiquer 'c_Bibliothèque' et non '"c_Bibliothèque"'.

C’est également vrai pour obj_nom, sauf dans le cas des routines (obj_typ « function », « aggregate », « procedure » ou « routine »). Pour ces objets, les guillemets devront impérativement être présents dans obj_nom si le nom n’est pas normalisé – et seulement dans ce cas. Ainsi, on écrira 'suite_arithmetique(integer,integer)' (normalisé, sans guillemets), mais '"Suite Arithmétique"(integer,integer)' (non normalisé, avec guillemets).

De plus, lorsque l’objet à déplacer est une routine, obj_nom doit spécifier les types de ses arguments entre parenthèses.

Variantes

Le tableau suivant détaille l’effet de la fonction sur les droits appliqués à l’objet selon la valeur de l’argument variante.

Droits du producteur[1]

Droits des lecteur[2] et éditeur[3] (si définis)

Droits des autres rôles (le cas échéant)

1

Transférés de l’ancien producteur au nouveau.

Transférés si un éditeur (ou lecteur) était désigné pour l’ancien schéma, sinon application des privilèges standard pour la fonction.

Conservés à l’identique.

2

Réinitialisés selon les privilèges standards.

Réinitialisés selon les privilèges standards.

Supprimés.

3

Transférés de l’ancien producteur au nouveau.

Transférés si un éditeur (ou lecteur) était désigné pour l’ancien schéma, sinon application des privilèges standard pour la fonction.

Supprimés.

4

Transférés de l’ancien producteur au nouveau.

Conservés à l’identique.

Conservés à l’identique.

5

Transférés de l’ancien producteur au nouveau.

Réinitialisés selon les privilèges standards.

Supprimés.

6

Réinitialisés selon les privilèges standards.

Réinitialisés selon les privilèges standards.

Conservés à l’identique.

Pour les variantes n°2 et 6, les privilèges du producteurs sont en fait d’abord transférés (par PostgreSQL, lors de l’exécution de la commande de réassignation du propriétaire), puis explicitement réinitialisés par la fonction dans un second temps.

On pourra noter que la variante n°4 équivaut à une commande ALTER [OBJET] … SET SCHEMA. Toutes les autres sont absolument équivalentes entre elles dès lors qu’aucune modification manuelle n’a été réalisée.

La variante n°1 (valeur par défaut) adopte le comportement canonique d’ASGARD : transfert des privilèges pour les rôles producteur, éditeur et lecteur, et conservation pour les autres rôles.

La variante n°2 est une remise à zéro complète des privilèges.

Résultat

« __ DEPLACEMENT REUSSI. » si la requête s’est exécutée normalement.

Le détail des commandes GRANT et REVOKE exécutées apparaît dans l’onglet « Messages » de l’éditeur de requêtes de pgAdmin.

Exemple

Avec la variante n°2, qui revient aux droits standards.

La table journal_du_mur, dont la clé primaire est un champ serial, est déplacée de w_snow (producteur g_snum, pas d’éditeur, lecteur g_consult) à c_bibliotheque (producteur g_admin, éditeur g_snum, lecteur public). Le privilège DELETE avait été manuellement révoqué pour le producteur de l’ancien schéma.

1
2
SELECT z_asgard.asgard_deplace_obj('w_snow', 'journal_du_mur', 'table', 'c_bibliotheque', 2) ;
1
2
NOTICE: attribution de la propriété de c_bibliotheque.journal_du_mur au rôle producteur du schéma :
3
NOTICE: > ALTER table c_bibliotheque.journal_du_mur OWNER TO g_admin
4
NOTICE: ... Objet déplacé dans le schéma c_bibliotheque.
5
NOTICE:  réinitialisation des privilèges du nouveau producteur, g_admin :
6
NOTICE:  > GRANT DELETE ON TABLE c_bibliotheque.journal_du_mur TO g_admin
7
NOTICE: application des privilèges standards pour le rôle éditeur du schéma :
8
NOTICE: > GRANT SELECT, UPDATE, DELETE, INSERT ON TABLE c_bibliotheque.journal_du_mur TO g_snum
9
NOTICE: > GRANT SELECT, USAGE ON SEQUENCE c_bibliotheque.journal_du_mur_id_seq TO g_snum
10
NOTICE: suppression des privilèges de l'ancien lecteur, g_consult :
11
NOTICE: > REVOKE SELECT ON TABLE c_bibliotheque.journal_du_mur FROM g_consult
12
NOTICE: > REVOKE SELECT ON SEQUENCE c_bibliotheque.journal_du_mur_id_seq FROM g_consult
13
NOTICE: application des privilèges standards pour le rôle lecteur du schéma :
14
NOTICE: > GRANT SELECT ON TABLE c_bibliotheque.journal_du_mur TO public
15
NOTICE: > GRANT SELECT ON SEQUENCE c_bibliotheque.journal_du_mur_id_seq TO public