ORA_INVOKING_USER |
Appel l'utilisateur Oracle |
|---|---|
| Oracle Database SQL | Oracle 12c Release 1 (12.1) |
Syntaxe
| ORA_INVOKING_USER |
Description
Cette fonction permet de retourner le nom de l'utilisateur ayant invoqué une fonction ou procédure, utile notamment en contexte d'appels indirects ou de privilèges définis par l'invocateur.
Remarques
- Utilité dans les vues avec droits d'invocateur : Cette fonction permet d'identifier l'utilisateur qui exécute réellement une requête ou appelle une vue, même si celle-ci est possédée par un autre schéma. Cela est particulièrement utile lorsqu'une vue est créée avec la clause BEQUEATH CURRENT_USER, car le contexte d'exécution dépend alors des droits de l'invocateur plutôt que du propriétaire.
- Différence avec USER : Contrairement à la fonction USER, renvoyant toujours le nom du schéma dans lequel la session a été ouverte, ORA_INVOKING_USER se focalise sur l'utilisateur initiant la requête au moment de l'appel. Ainsi, si un utilisateur appelle une procédure d'un autre schéma, USER affichera le propriétaire, alors que ORA_INVOKING_USER affichera l'appelant.
- Gestion des privilèges dans les procédures stockées : En PL/SQL, l'utilisation de ORA_INVOKING_USER est essentielle lorsqu'on met en place des procédures définies avec AUTHID CURRENT_USER. Elle permet de vérifier explicitement qui invoque la procédure afin de contrôler dynamiquement l'accès à certaines fonctionnalités ou ressources.
- Utilisation en audit applicatif : Dans les systèmes où plusieurs comptes d'application interagissent avec une base de données, ORA_INVOKING_USER permet de tracer l'utilisateur source de l'action. Cela complète les mécanismes d'audit natifs d'Oracle, surtout quand les actions passent par des couches intermédiaires.
- Compatibilité introduite avec Oracle 12c : Cette fonction a été introduite dans Oracle Database 12c Release 1 (12.1) et n'est donc pas disponible dans les versions antérieures. Dans les systèmes mixtes où plusieurs instances d'Oracle sont utilisées, il faut donc prévoir des alternatives ou des tests de compatibilité avant intégration.
- Comportement en cascade d'appels : Lorsqu'une fonction ou procédure appelle d'autres fonctions ou procédures, ORA_INVOKING_USER conserve le nom du premier utilisateur qui a déclenché la chaîne d'appels. Cela permet de préserver une cohérence dans la traçabilité même sur plusieurs niveaux d'exécution.
- Sécurité et cloisonnement : L'utilisation de ORA_INVOKING_USER renforce la sécurité, car elle permet de mettre en place des conditions basées sur l'identité de l'appelant et non uniquement sur les droits statiques. Cela évite par exemple qu'un utilisateur ayant accès à un objet via un rôle hérite indirectement de privilèges non voulus.
- Support des synonymes et liens de base de données : Si une fonction est appelée à travers un synonyme public ou un lien de base de données (DBLINK), ORA_INVOKING_USER continue à renvoyer l'utilisateur local qui a lancé la requête, ce qui est crucial pour des contrôles d'accès distribués.
- Intégration dans les règles de validation métier : Dans certaines logiques métier, les opérations autorisées dépendent directement de l'identité de l'utilisateur, et pas seulement de ses privilèges. ORA_INVOKING_USER permet d'appliquer ces validations dans les fonctions et déclencheurs sans avoir à passer le nom en paramètre.
- Impact sur la performance : L'appel à ORA_INVOKING_USER est extrêmement léger car il ne nécessite pas de jointure ni de recherche en métadonnées complexes. Cependant, dans des vues très sollicitées, il convient de mesurer l'impact de son utilisation répétée, surtout lorsqu'elle est combinée avec d'autres fonctions contextuelles.
- Différence avec SYS_CONTEXT : Bien qu'on puisse obtenir des informations sur l'utilisateur via SYS_CONTEXT('USERENV', 'SESSION_USER'), la fonction ORA_INVOKING_USER offre une lisibilité plus directe et spécifique au contexte d'invocateur. Elle évite aussi de devoir mémoriser les noms de paramètres exacts dans SYS_CONTEXT.
- Utilisation en combinaison avec ORA_INVOKING_USERID : Dans les scénarios où l'on a besoin à la fois du nom et de l'identifiant numérique interne de l'utilisateur, ORA_INVOKING_USER peut être combinée avec ORA_INVOKING_USERID. Cela permet de gérer à la fois des contrôles lisibles par un humain et des vérifications rapides basées sur les IDs internes.
Dernière mise à jour : Dimanche, le 29 Juin 2025