私のアプリケーションで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_USER
にSELECT
へのアクセス許可を付与します。
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
明示的な許可を与えずにこのエラーを回避する方法はありますか?
はい、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.