web-dev-qa-db-fra.com

Comment accorder l'exécution sur dbms_lock dans Oracle?

J'ai besoin d'utiliser la procédure dbms_lock.sleep de l'utilisateur usr1. Je ne peux pas me connecter en tant que sys, mais j'ai un mot de passe pour l'utilisateur usr2 qui a le privilège "accorder tout privilège d'objet". Cependant, lorsque je suis connecté en tant que usr2 et que j'essaie d'émettre

grant execute on sys.dbms_lock to usr1

J'obtiens l'exception ORA-01031 "Privilèges insuffisants". La même chose fonctionne avec un package de test sur un autre utilisateur. Les packages système sont-ils traités spécialement ou ai-je oublié quelque chose?

12
Tomasz Żuk

Les packages système sont traités spécialement, en fonction de la valeur du paramètre d'initialisation O7_DICTIONARY_ACCESSIBILITY. S'il s'agit de FALSE, qui est la valeur par défaut depuis Oracle 9i, les privilèges ANY ne s'appliquent pas au dictionnaire de données. La documentation y fait référence sous le nom de "protection par dictionnaire".

Le plus proche que je peux trouver dans le guide de sécurité - ici et ici - ne fait référence aux tableaux qu'à titre d'exemples.

Cependant, la note de support Oracle 174753.1 indique explicitement que la protection par dictionnaire remplace grant any object privilege. Je n'ai pas le droit de citer cela, mais cela explique ce que vous voyez; cela vaut la peine de chercher si vous y avez accès.

Donc, la seule façon pour usr2 pouvoir grant execute on sys.dbms_lock to usr1 c'est au DBA d'avoir fait grant execute on sys.dbms_lock to usr2 with grant option.

Comme le dit Ben, vous devrez soit obtenir le DBA pour accorder l'autorisation à usr1 directement, ou ajoutez le with grant option aux privilèges accordés à usr2; ou avoir usr2 créer une procédure wrapper autour de dbms_lock appeler et accorder des autorisations à ce sujet à usr1.

11
Alex Poole

Il sonne comme si SYS n'a pas obtenu le rôle DBA ou que SYS n'a pas le privilège GRANT ANY OBJECT. Pour citer la documentation

Pour accorder un privilège d'objet, vous devez être propriétaire de l'objet, ou le propriétaire de l'objet doit vous avoir accordé les privilèges d'objet avec l'option GRANT OPTION, ou vous devez avoir obtenu le privilège système GRANT ANY OBJECT PRIVILEGE. Si vous disposez du PRIVILÈGE ACCORDER UN OBJET, vous ne pouvez accorder le privilège d'objet que si le propriétaire de l'objet aurait pu accorder le même privilège d'objet.

Cela implique que vous ne pouvez pas accorder d'exécution sur dbms_lock parce que SYS n'aurait pas pu le faire.

Lors de l'installation SYS obtient automatiquement le rôle DBA alors peut-être que quelqu'un a changé cela ou a créé un autre utilisateur avec le rôle DBA.

Dans tous les cas, vous devrez impliquer votre administrateur de base de données si vous n'avez accès qu'à ces deux utilisateurs. Demandez-leur d'accorder l'exécution sur les packages dont vous avez besoin aux utilisateurs qui en ont besoin. C'est à eux de vous donner une bonne raison pour laquelle ils ne vous autoriseront pas à exécuter les packages dont vous avez besoin pour faire votre travail.

Si vous ne pouvez pas obtenir un accès complet à dbms_lock vous pouvez toujours créer une procédure dans un autre utilisateur qui encapsule dbms_lock.sleep vous avez besoin, puis accordez l'exécution sur cette procédure uniquement.

4
Ben