9.13. Fonctions diverses

Tableau 9-35 affiche plusieurs fonctions qui extrait des informations de la session et du système.

Tableau 9-35. Fonctions d'informations de session

NomType de retourDescription
current_database()namenom de la base de données courante
current_schema()namenom du schéma courant
current_schemas(boolean)name[]nom des schémas dans le chemin de recherche, avec optionnellement les schémas implicites
current_usernamenom d'utilisateur du contexte d'exécution courant
session_usernamenom de l'utilisateur de la session
usernameéquivalent à current_user
version()textinformations de version de PostgreSQL

session_user est l'utilisateur qui a initié la connexion à la base de données ; il est fixe pour la durée de la connexion. current_user est l'identifiant de l'utilisateur utilisable pour les vérifications de permissions. Il est habituellement identique à l'utilisateur de la session, mais il change lors de l'exécution des fonctions avec l'attribut SECURITY DEFINER. Dans le vocable Unix, l'utilisateur de la session est l'<< utilisateur réel >> (real user) et l'utilisateur courant est l'<< utilisateur effectif >> (effective user).

Note : current_user, session_user et user ont un statut syntaxique spécial en SQL : ils doivent être appelés sans parenthèses à droite.

current_schema renvoie le premier nom de schéma du chemin de recherche ou une valeur nulle si le chemin de recherche est vide. C'est le schéma qui sera utilisé pour toutes les tables ou tous les autres objets nommés créés sans spécification du schéma cible. current_schemas(boolean) renvoie un tableau des noms de tous les schémas présents dans le chemin de recherche. L'option booléenne détermine si les schémas systèmes sont inclus implicitement ou non dans le chemin de recherche renvoyé, par exemple pour pg_catalog.

Note : Le chemin de recherche peut être modifié pendant l'exécution. La commande est :

SET search_path TO schéma1 [, schéma2,
...]

version() renvoie une chaîne décrivant la version du serveur PostgreSQL.

Tableau 9-36 affiche les fonctions disponibles pour lancer des requêtes et modifier les paramètres de configuration à l'exécution.

Tableau 9-36. Fonctions de configuration

NomType de retourDescription
current_setting (nom_paramètre) textvaleur courante du paramétrage
set_config(nom_paramètre, nouvelle_valeur, est_local) textinitialise le paramètre et renvoie la nouvelle valeur

La fonction current_setting renvoie la valeur courante du paramètre nom_paramètre. Cela correspond à la commande SQL SHOW. Par exemple :

SELECT current_setting('datestyle');

 current_setting
-----------------
 ISO, MDY
(1 row)

set_config configure le paramètre nom_paramètre avec nouvelle valeur. Si est_local est true, la nouvelle valeur est seulement appliquée à la transaction actuelle. Si vous voulez que la nouvelle valeur s'applique pour la session courante, utilisez false à la place. Cette fonction correspond à la commande SQL SET. Un exemple :

SELECT set_config('log_statement_stats', 'off', false);

 set_config
------------
 off
(1 row)

Tableau 9-37 liste les fonctions qui permettent à l'utilisateur de connaître les privilèges d'accès aux objets. Voir Section 5.7 pour plus d'informations sur les privilèges.

Tableau 9-37. Fonctions de consultation des privilèges d'accès

NomType de retourDescription
has_table_privilege (utilisateur, table, privilège) booleanutilisateur a-t-il le privilège privilège sur table
has_table_privilege (table, privilège) booleanl'utilisateur courant a-t-il le privilège privilège sur table
has_database_privilege (utilisateur, base_de_données, privilège) booleanutilisateur a-t-il le privilège privilège sur base
has_database_privilege (base_de_données, privilège) booleanl'utilisateur courant a-t-il le privilège privilège sur base
has_function_privilege (utilisateur, fonction, privilège) booleanutilisateur a-t-il le privilège privilège sur fonction
has_function_privilege (fonction, privilège) booleanl'utilisateur courant a-t-il e privilège privilège sur fonction
has_language_privilege (utilisateur, langage, privilège) booleanutilisateur a-t-il le privilège privilège sur langage
has_language_privilege (langage, privilège) booleanl'utilisateur courant a-t-il le privilège privilège sur langage
has_schema_privilege (utilisateur, schéma, privilège) booleanutilisateur a-t-il le privilège privilège sur schéma
has_schema_privilege (schéma, privilège) booleanl'utilisateur courant a-t-il le privilège privilège sur schéma

has_table_privilege vérifie qu'un utilisateur peut accéder à une table d'une façon particulière. L'utilisateur peut être spécifié par son nom ou par son identifiant (pg_user.usesysid). Si cet argument est omis, la fonction utilise current_user. La table peut être spécifiée par son nom ou par son OID. (Du coup, il existe six variantes de has_table_privilege, qui sont distinguables par leur nom et par le type de leurs arguments.) Lors de la spécification par nom, celui-ci peut être détaillé avec le nom du schéma si nécessaire. Le type de privilège d'accès désiré est spécifié par une chaîne qui doit correspondre à une des valeurs suivantes : SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ou TRIGGER. (Néanmoins, la casse de la chaîne n'a pas d'importance.) Voici un exemple :

SELECT has_table_privilege('mon_schema.mytable', 'select');

has_database_privilege vérifie si un utilisateur peut accéder à une base de données d'une façon particulière. Les possibilités sur les arguments sont analogues à celles de la fonction has_table_privilege. Les types de privilèges d'accès désirés ont les valeurs suivantes : CREATE, TEMPORARY ou TEMP (qui est équivalent à TEMPORARY).

has_function_privilege vérifie si un utilisateur peut accéder à une fonction d'une façon particulière. Les possibilités sur les arguments sont analogues à celles de la fonction has_table_privilege. Lors de la spécification d'une fonction avec une chaîne de texte plutôt que son OID, l'entrée permise est la même que pour le type de données regprocedure. Le type de privilège d'accès désiré doit être EXECUTE.

has_language_privilege vérifie si un utilisateur peut accéder à un langage procédural d'une façon particulière. Les possibilités pour les arguments sont analogues à ceux de has_table_privilege. Le type de privilège d'accès désiré doit être USAGE.

has_schema_privilege vérifie si un utilisateur peut accéder à un schéma d'une façon particulière. Les possibilités pour ses arguments sont analogues à celles de la fonction has_table_privilege. Le type de privilège d'accès désiré doit être parmi CREATE et USAGE.

Pour évaluer si un utilisateur détient une option << grant >> sur le privilège, ajoutez WITH GRANT OPTION avec la clé de privilège ; par exemple 'UPDATE WITH GRANT OPTION'.

Tableau 9-38 affiche les fonctions qui déterminent si un certain objet est visible dans le chemin de recherche de schémas actuel. Une table est dite visible si son schéma est dans le chemin de recherche et qu'aucune table du même nom apparaît plus tôt dans le chemin de recherche. C'est équivalent à l'instruction dont la table peut être référencée par nom sans qualification explicite de schéma. Par exemple, pour lister les noms de toutes les tables visibles :

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Tableau 9-38. Fonctions d'information de visibilité dans le schéma

NomType de retourDescription
pg_table_is_visible (oid_table) booleanla table est-elle visible dans le chemin de recherche
pg_type_is_visible (oid_type) booleanle type (ou domaine) est-il visible dans le chemin de recherche
pg_function_is_visible (oid_fonction) booleanla fonction est-elle visible dans le chemin de recherche
pg_opérateur_is_visible (oid_opérateur) booleanl'opérateur est-il visible dans le chemin de recherche
pg_opclass_is_visible (oid_opclass) booleanla classe d'opérateur est-elle visible dans le chemin de recherche
pg_conversion_is_visible (oid_conversion) booleanla conversion est-elle visible dans le chemin de recherche

pg_table_is_visible effectue une vérification pour les tables (ou vues ou tout autre type d'entrée dans pg_class). pg_type_is_visible, pg_function_is_visible, pg_opérateur_is_visible, pg_opclass_is_visible et pg_conversion_is_visible réalisent respectivement les mêmes sortes de vérification de visibilité pour les types (et domaines), fonctions, opérateurs, classes d'opérateur et conversions. Pour les fonctions et opérateurs, un objet dans le chemin de recherche est visible si aucun objet du même nom et des même types de données pour les arguments plus tôt dans le chemin. Pour les classes d'opérateurs, à la fois les noms et les méthodes d'accès aux index associés sont considérés.

Toutes les fonctions requièrent les OID des objets pour identifier l'objet à vérifier. Si vous voulez tester un objet par son nom, il est mieux d'utiliser les types d'alias d'OID (regclass, regtype, regprocedure ou regopérateur), par exemple

SELECT pg_type_is_visible('mon_schema.widget'::regtype);

Notez que cela n'aurait pas de sens de tester un nom non qualifié de cette façon --- si le nom est reconnu, il doit être visible.

Tableau 9-39 liste des fonctions qui extraient des informations des catalogues système. pg_get_viewdef, pg_get_ruledef, pg_get_indexdef, pg_get_triggerdef et pg_get_constraintdef reconstruisent respectivement la commande de création d'une vue, d'une règle, d'un index, d'un déclencheur ou d'une contrainte. (Notez qu'il s'agit d'une reconstruction décompilée, pas du texte original de la commande.) La plupart de ces commandes viennent en deux variantes dont une qui peut optionnellement << afficher joliment >> le résultat. Le joli format est plus lisible mais le format par défaut a plus de chances d'être interprété de la même façon par les future versions de PostgreSQL ; évitez l'utilisation du joli affichage dans des buts de sauvegarde. Passer faux au paramètre d'affichage amélioré renvoie le même résultat que la variante sans paramètre. pg_get_expr décompile la forme interne d'une expression individuelle telle que la valeur par défaut d'une colonne. Cela peut être utile lors de l'examen du contenu du catalogue système. pg_get_userbyid extrait un nom d'utilisateur suivant son numéro d'identifiant.

Tableau 9-39. Fonctions d'informations sur le catalogue système

NomType de retourDescription
pg_get_viewdef (nom_vue)textrécupère la commande CREATE VIEW d'une vue (obsolète)
pg_get_viewdef (nom_vue, joli_affichage)textrécupère la commande CREATE VIEW d'une vue (obsolète)
pg_get_viewdef (oid_vue)textrécupère la commande CREATE VIEW d'une vue
pg_get_viewdef (oid_vue, joli_affichage)textrécupère la commande CREATE VIEW d'une vue
pg_get_ruledef (oid_règle)textrécupère la commande CREATE RULE d'une règle
pg_get_ruledef (oid_règle, joli_affichage)textrécupère la commande CREATE RULE d'une règle
pg_get_indexdef (oid_index)textrécupère la commande CREATE INDEX d'un index
pg_get_indexdef (oid_index, no_colonne, joli_affichage)textrécupère la commande CREATE INDEX d'un index ou la définition d'une seule colonne de l'index si no_colonne est différent de zéro
pg_get_triggerdef (oid_déclencheur)textrécupère la commande CREATE [ CONSTRAINT ] TRIGGER d'un déclencheur
pg_get_constraintdef (oid_contrainte)textrécupère la définition d'une contrainte
pg_get_constraintdef (oid_contrainte, joli_affichage)textrécupère la définition d'une contrainte
pg_get_expr (expression, oid_relation)textdécompile la forme interne d'une expression, en supposant que toute variable réfère à la relation indiquée dans le second paramètre
pg_get_expr (expression, oid_relation, joli_affichage)textdécompile la forme interne d'une expression, en supposant que toute variable réfère à la relation indiquée dans le second paramètre
pg_get_userbyid (id_utilisateur)nameobtient le nom de l'utilisateur avec l'identifiant donné

La fonction affichée dans Tableau 9-40 extrait les commentaires stockés précédemment avec la commande COMMENT. Une valeur nulle est renvoyée si aucun commentaire n'est trouvé avec les paramètres spécifiés.

Tableau 9-40. Fonctions d'informations sur les commentaires

NomType de retourDescription
obj_description (objet, nom_catalogue)textobtenir un commentaire sur une base de données
obj_description (oid_objet)textobtenir un commentaire sur une base de données (obsolète)
col_description (oid_table, no_colonne)textobtenir un commentaire sur la colonne d'une table

La forme à deux paramètres d'obj_description renvoie le commentaire d'un objet de la base de données suivant son OID et le nom du catalogue système le contenant. Par exemple, obj_description(123456,'pg_class') retrouvera le commentaire de la table d'OID 123456. La forme à un paramètre requiert seulement l'OID de l'objet. Elle est maintenant obsolète car il n'y a pas de garantie que les OID soient uniques avec différents catalogues système ; du coup, un mauvais commentaire pourrait être renvoyé.

col_description renvoie le commentaire d'une colonne de table, spécifié par l'OID de la table et le numéro de la colonne. obj_description ne peut pas être utilisé pour les colonnes de table car les colonnes n'ont pas leur propre OID.