web-dev-qa-db-ja.com

ALL_OBJECTSを使用するビューでのSELECTの付与中にエラーが発生しました

私のアプリケーションでOracle 12cをテストしています。特定のスキーマでこのビューに似たものがあり、この質問ではMY_OWNER_SCHEMAと呼びます。

CREATE OR REPLACE VIEW OBJECT_COMMENTS AS
SELECT OBJS.OWNER, OBJS.OBJECT_NAME, COMMENTS.COMMENTS
FROM ALL_OBJECTS OBJS
LEFT JOIN ALL_TAB_COMMENTS COMMENTS ON (
    COMMENTS.OWNER = OBJS.OWNER 
    AND COMMENTS.TABLE_NAME = OBJS.OBJECT_NAME
)
WHERE
    OBJS.OWNER = 'MY_OWNER_SCHEMA'
    AND OBJS.OBJECT_TYPE IN ('TABLE', 'VIEW')
WITH READ ONLY
;

ビューは一種の「メタデータ」ビューであり、すべてのテーブルとビューにコメントがあることを(プログラムで)確認するために使用されます。 MY_OWNER_SCHEMAはデプロイ時以外はロックされているため、MY_LOGIN_USERSELECTへのアクセス許可を付与します。

GRANT SELECT ON OBJECT_COMMENTS TO MY_LOGIN_USER;

(このGRANTは、MY_OWNER_SCHEMAとしてログインしているときに、デプロイ中に実行されます。)

これはOracle 11gでも問題なく機能し、12cでも機能します。ただし、12cのみで、GRANTは次のメッセージで失敗します。

SQL Error: ORA-01720: grant option does not exist for 'SYS.ALL_OBJECTS'
01720. 00000 -  "grant option does not exist for '%s.%s'"
*Cause:    A grant was being performed on a view or a view was being replaced
           and the grant option was not present for an underlying object.
*Action:   Obtain the grant option on all underlying objects of the view or
           revoke existing grants on the view.

ALL_OBJECTSはすべてのユーザーがアクセスできるパブリックインターフェイスであり、ユーザーがすでにアクセスできるオブジェクトのみを表示するため、これはかなり奇妙です。 Oracle 12cの権限モデルまたはデフォルトの権限設定で何か変更はありましたか?データベースが異なる方法でインストールされた可能性はありますか?このグローバルシステムビューにGRANTへのMY_OWNER_SCHEMA明示的な許可を与えずにこのエラーを回避する方法はありますか?

1
jpmc26

はい、READの代わりにSELECT特権(12cで導入)を使用します。

SQL> create user MY_OWNER_SCHEMA identified by MY_OWNER_SCHEMA;

User created.

SQL> create user MY_LOGIN_USER identified by MY_LOGIN_USER;

User created.

SQL> grant create session, create view to MY_OWNER_SCHEMA;

Grant succeeded.

SQL> conn MY_OWNER_SCHEMA/MY_OWNER_SCHEMA
Connected.
SQL> CREATE OR REPLACE VIEW OBJECT_COMMENTS AS
SELECT OBJS.OWNER, OBJS.OBJECT_NAME, COMMENTS.COMMENTS
FROM ALL_OBJECTS OBJS
LEFT JOIN ALL_TAB_COMMENTS COMMENTS ON (
    COMMENTS.OWNER = OBJS.OWNER
    AND COMMENTS.TABLE_NAME = OBJS.OBJECT_NAME
)
WHERE
  2    3    4    5    6    7    8    9      OBJS.OWNER = 'MY_OWNER_SCHEMA'
    AND OBJS.OBJECT_TYPE IN ('TABLE', 'VIEW')
WITH READ ONLY
; 10   11   12

View created.

SQL> GRANT SELECT ON OBJECT_COMMENTS TO MY_LOGIN_USER;
GRANT SELECT ON OBJECT_COMMENTS TO MY_LOGIN_USER
                *
ERROR at line 1:
ORA-01720: grant option does not exist for 'SYS.ALL_OBJECTS'

上記は失敗しますが:

SQL> GRANT READ ON OBJECT_COMMENTS TO MY_LOGIN_USER;

Grant succeeded.
2
Balazs Papp