PL/SQL : La clause AUTHID CURRENT_USER

Quand on appelle une procédure, une fonction ou un package il y a deux modes de privilèges d'exécution :
Soit avec les droits de définition; le code utilisé permet d'accéder aux objets qu'il appelle avec les droits utilisateur qui a écrit ce code.
Soit avec les droits d'invocation; le code est alors appelé avec les droits de l'utilisateur qui appelé le code stocké.
Explication :
L’utilisateur Scott se connecte et fait une select sur la table employees qui est dans le schéma hr :
SQL> select first_name from HR.employees where employee_id=190;
select first_name from HR.employees where employee_id=190
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
Il obtient une erreur; alors l'utilisateur HR crée une procédure qui fait la même chose et donne le droit d'exécution a Scott :
SQL> create or replace procedure normale_proc is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.
SQL> grant execute on normale_proc to scott;
Autorisation de privilèges (GRANT) accepte.
SQL>
Maintenant pour Scott ça donne le résultat suivant :
SQL> set serveroutput on
SQL> exec hr.normale_proc
le nom est :Timothy

Procédure PL/SQL terminée avec succès.
SQL>
Ce genre de fonctionnement peut s'avérer très pratiques si on ne veut pas donner des privilèges sur les objets auxquels il accède notre code, mais il peut s'avérer tres dangereux si notre code contient une quelconque vulnérabilité, par exemple une injection SQL alors les droits d'exécution seront ceux du propriétaire du code.
Pour activer les droits d'invocation pour un code il suffit d'ajouter la clause AUTHID CURRENT_USER avant IS, le même exemple :
SQL> create or replace procedure aut_proc AUTHID CURRENT_USER is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.

SQL> grant execute on aut_proc to scott;
Autorisation de privilèges (GRANT) acceptée.
SQL>
Maintenant pour Scott ca donne un 942:
SQL> exec hr.aut_proc
BEGIN hr.aut_proc; END;
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
ORA-06512: Ó "HR.AUT_PROC", ligne 4
ORA-06512: Ó ligne 1

pour savoir quelle mode d'exécution pour une procédure on consulte la vue user_procedures :
SQL> select OBJECT_NAME,AUTHID from user_procedures
2 where OBJECT_NAME in ('AUT_PROC','NORMALE_PROC');

OBJECT_NAME AUTHID
------------------------------ ------------
AUT_PROC CURRENT_USER
NORMALE_PROC DEFINER