ユーザーusr1のdbms_lock.sleepプロシージャを使用する必要があります。 sysとしてログインできませんが、「任意のオブジェクト権限を付与する」権限を持つユーザーusr2のパスワードを持っています。ただし、usr2としてログインして発行しようとすると
grant execute on sys.dbms_lock to usr1
ORA-01031の「権限が不十分です」という例外が発生します。同じことが別のユーザーのテストパッケージでも機能します。システムパッケージは特別に扱われますか、それとも見逃しましたか?
システムパッケージは、初期化パラメーターO7_DICTIONARY_ACCESSIBILITY
の値に応じて、特別に扱われます。それがOracle 9i以降のデフォルトであるFALSE
の場合、ANY
特権はデータディクショナリに適用されません。ドキュメントでは、これを「辞書保護」と呼んでいます。
私がセキュリティガイドで見つけることができる最も近い- here および here -例としての表のみを参照します。
ただし、Oracleサポートノート174753.1では、ディクショナリ保護がgrant any object privilege
に取って代わると明記されています。私はそれを引用することはできませんが、それはあなたが見ているものを説明しています。アクセスできる場合は、調べてみる価値があるかもしれません。
したがって、usr2
がgrant execute on sys.dbms_lock to usr1
を実行できる唯一の方法は、DBAがgrant execute on sys.dbms_lock to usr2 with grant option
を実行することです。
ベンが言うように、DBAにusr1
への権限を直接付与するか、with grant option
をusr2
に付与された権限に追加する必要があります。または、usr2
にdbms_lock
呼び出しのラッパープロシージャを作成させ、その権限をusr1
に付与します。
SYSにDBAロールが付与されていないか、またはSYSにGRANT ANY OBJECT特権がないかのようにsoundsします。 ドキュメント から引用するには
オブジェクト権限を付与するには、オブジェクトの所有者であるか、オブジェクトの所有者がGRANT OPTIONでオブジェクト権限を付与しているか、GRANT ANY OBJECT PRIVILEGEシステム権限を付与されている必要があります。 GRANT ANY OBJECT PRIVILEGEがある場合、オブジェクト所有者が同じオブジェクト権限を付与できた場合にのみ、オブジェクト権限を付与できます。
これは、SYSが実行できなかったため、dbms_lock
で実行を許可できないことを意味します。
インストール時 SYSにはDBAロールが自動的に付与されます したがって、おそらく誰かがこれを変更しているか、DBAロールを持つ別のユーザーを作成しています。
どちらの方法でも、これらの2人のユーザーにしかアクセスできない場合は、DBAを関与させる必要があります。必要なパッケージの実行を、それを必要とするユーザーに許可するように依頼します。あなたがあなたの仕事をするために必要なパッケージの実行を許可しない理由をあなたに与えるのは彼ら次第です。
dbms_lock
への完全なアクセス権を取得できない場合は、必要なdbms_lock.sleep
をラップする別のユーザーでいつでもプロシージャを作成し、そのプロシージャに対してのみ実行を許可できます。