13

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

grant execute on sys.dbms_lock to usr1

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

4

2 に答える 2

12

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

セキュリティガイドで見つけることができる最も近いもの -ここここ- 例としてのみ表を参照してください。

ただし、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です。

Ben が言うように、DBA にパーミッションを直接付与してもらうか、付与された権限に をusr1追加する必要があります。または、呼び出しの周りにラッパー プロシージャを作成し、それに対するアクセス許可を に付与します。with grant optionusr2usr2dbms_lockusr1

于 2012-11-16T10:19:57.063 に答える
4

SYSにDBAロールが付与されていないか、SYSにGRANTANYOBJECT権限がないように聞こえます。ドキュメントから引用するには

オブジェクト特権を付与するには、オブジェクトを所有している必要があります。または、オブジェクトの所有者がGRANT OPTIONを使用してオブジェクト特権を付与しているか、GRANT ANYOBJECTPRIVILEGEシステム特権を付与されている必要があります。GRANT ANY OBJECT PRIVILEGEを持っている場合、オブジェクト所有者が同じオブジェクト特権を付与できた場合にのみ、オブジェクト特権を付与できます。

これはdbms_lock、SYSが実行を許可できなかったため、実行を許可できないことを意味します。

インストール時にSYSにDBAロールが自動的に付与されるため、誰かがこれを変更したか、DBAロールを持つ別のユーザーを作成した可能性があります。

いずれにせよ、これら2人のユーザーにしかアクセスできない場合は、DBAを関与させる必要があります。必要なパッケージの実行を、それを必要とするユーザーに許可するように依頼します。彼らがあなたの仕事をするためにあなたが必要とするパッケージであなたに実行を許可しない理由をあなたに与えるのは彼ら次第です。

フルアクセスを取得できない場合dbms_lockは、いつでも別のユーザーでdbms_lock.sleep必要なラップのプロシージャを作成し、そのプロシージャのみで実行を許可できます。

于 2012-11-15T22:58:43.067 に答える