web-dev-qa-db-ja.com

Oracleでdbms_lockの実行を許可するにはどうすればよいですか?

ユーザーusr1のdbms_lock.sleepプロシージャを使用する必要があります。 sysとしてログインできませんが、「任意のオブジェクト権限を付与する」権限を持つユーザーusr2のパスワードを持っています。ただし、usr2としてログインして発行しようとすると

grant execute on sys.dbms_lock to usr1

ORA-01031の「権限が不十分です」という例外が発生します。同じことが別のユーザーのテストパッケージでも機能します。システムパッケージは特別に扱われますか、それとも見逃しましたか?

12
Tomasz Żuk

システムパッケージは、初期化パラメーターO7_DICTIONARY_ACCESSIBILITYの値に応じて、特別に扱われます。それがOracle 9i以降のデフォルトであるFALSEの場合、ANY特権はデータディクショナリに適用されません。ドキュメントでは、これを「辞書保護」と呼んでいます。

私がセキュリティガイドで見つけることができる最も近い- here および here -例としての表のみを参照します。

ただし、Oracleサポートノート174753.1では、ディクショナリ保護がgrant any object privilegeに取って代わると明記されています。私はそれを引用することはできませんが、それはあなたが見ているものを説明しています。アクセスできる場合は、調べてみる価値があるかもしれません。

したがって、usr2grant execute on sys.dbms_lock to usr1を実行できる唯一の方法は、DBAがgrant execute on sys.dbms_lock to usr2 with grant optionを実行することです。

ベンが言うように、DBAにusr1への権限を直接付与するか、with grant optionusr2に付与された権限に追加する必要があります。または、usr2dbms_lock呼び出しのラッパープロシージャを作成させ、その権限をusr1に付与します。

11
Alex Poole

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をラップする別のユーザーでいつでもプロシージャを作成し、そのプロシージャに対してのみ実行を許可できます。

4
Ben