Modification des objets

ASGARD référence les schémas, mais pas les objets qu’ils contiennent, ce qui le rend relativement peu efficace quand il s’agit de suivre leurs changements d’état.

Il interagit uniquement avec les commandes ALTER [OBJET] :

Et sa seule action est d’attribuer ou réattribuer la propriété de l’objet en question au producteur du schéma.

Exemple

Lorsque la table journal_du_mur est déplacée de w_snow (producteur g_snum) à c_bibliotheque (producteur g_admin), g_admin obtient la propriété de la table :

1
2
ALTER TABLE w_snow.journal_du_mur SET SCHEMA c_bibliotheque ;
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
ALTER TABLE

Dans ces conditions, les commandes ALTER [OBJET] … OWNER qui viseraient à définir un propriétaire différent du producteur du schéma sont inhibées : après exécution de la commande, ASGARD rend la propriété de l’objet au producteur.

Exemple

Tentative pour attribuer à jon.snow la propriété de la table journal_du_mur :

1
2
ALTER TABLE w_snow.journal_du_mur OWNER TO "jon.snow" ;
1
2
NOTICE: attribution de la propriété de w_snow.journal_du_mur au rôle producteur du schéma :
3
NOTICE: > ALTER table w_snow.journal_du_mur OWNER TO g_snum
4
ALTER TABLE

ASGARD peut repérer qu’un objet n’a plus le bon propriétaire, mais il lui est impossible de distinguer spécifiquement les commandes ALTER [OBJET] … SET SCHEMA parmi l’ensemble des commandes ALTER [OBJET]. Dès lors, il n’est pas en mesure de transférer automatiquement les privilèges des éditeur[3] et lecteur[4] de l’ancien schéma à ceux du nouveau. Très concrètement, hormis pour l’ancien et le nouveau producteur (entre lesquels les privilèges sont transférés), les droits sur un objet restent inchangés lorsqu’il est déplacé par une commande ALTER ou n'importe quelle méthode externe à ASGARD (fonctionnalité de pgAdmin, DBManager...).

Pour une gestion plus élaborée des droits lors d’un changement de schéma, il est recommandé de procéder au déplacement en utilisant la fonction asgard_deplace_obj.

Il est également possible de déplacer l’objet avec une commande SQL standard puis de recourir a posteriori à la fonction asgard_initialise_obj afin de nettoyer les droits sur l’objet déplacé et revenir aux privilèges standards. Si l’objet déplacé est une table avec un champ serial, il faudra alors penser à appliquer également la fonction asgard_initialise_obj sur la séquence associée – ou utiliser asgard_initialise_schema pour réinitialiser les droits sur tous les objets du schéma.

On remarquera que la question ne se pose que pour les objets sur lesquels il est possible de conférer des privilèges. Pour les conversions, collationnements, opérateurs, dictionnaires et configuration de recherche plein texte, la question ne se pose pas, il convient et suffit d’utiliser une commande ALTER [OBJET] … SET SCHEMA pour changer l’objet de schéma. ASGARD prendra soin d’attribuer la propriété de l’objet au producteur du schéma de destination et aucune autre action n'est nécessaire.

ComplémentEt dans AsgardManager ?

Le plugin QGIS AsgardManager mobilise asgard_deplace_obj pour ses fonctionnalités de déplacement d'objets, aussi bien par glisser-déposer qu'avec les actions Déplacer/Couper et Déplacer/Coller. Plus précisément, il utilise la variante par défaut de la fonction (variante n°1), qui transfère à l'identique les privilèges des producteur, éditeur et lecteur de l'ancien schéma à ceux du nouveau schéma, en préservant les éventuels privilèges alloués à d'autres rôles.