ビューを作成し、ORA-01720エラーの問題を報告します



Create View Report Ora 01720 Error Problem



ビューを作成すると、次の問題が発生します。



そして、ビューでオブジェクトの権限を確認します。



これは、ビューに作成するEXECUTE権限をユーザーに付与する関数です。

公式説明:



#01720、00000、 '許可オプションは'%s。%s ''には存在しません

// *原因:ビューに対して付与が実行されていたか、ビューが置き換えられていました

//そしてgrantオプションは基礎となるオブジェクトに存在しませんでした。

// *アクション:ビューの基になるすべてのオブジェクトで付与オプションを取得するか、

//ビューの既存の付与を取り消します。

HENによるMOSドキュメントの説明は非常に明確です

11.2.0.4へのアップグレード後、「ビューの作成または置換」の実行が「ORA-01720:付与オプションが存在しない」で失敗する(ドキュメントID 1628033.1)

に適用されます:

Oracle Database-EnterpriseEdition-バージョン11.2.0.4から11.2.0.4 [リリース11.2]
このドキュメントの情報は、すべてのプラットフォームに適用されます。

症状

11.2.0.3から11.2.0.4にアップグレードした後、「ビューの作成または置換」ステートメントの実行中に次のエラーが発生します。

ORA-01720:付与オプションが存在しません

ビューはアップグレード前に作成され、「ビューの作成または置換」は正常に機能していました。

たとえば、次のテストケースはバージョン11.2.0.3でエラーなしで実行されますが、最後のステートメント 'create or replace view testv as select * from u2.test'は11.2.0.4で失敗します。

接続/ sysdbaとして
-ユーザーu1カスケードを削除します
-ユーザーu2カスケードを削除します
u1で識別されるユーザーu1を作成します
u2で識別されるユーザーu2を作成します
u1にリソースを付与する
u2にリソースを付与する
u1に作成セッションを許可します
u2に作成セッションを付与します
u1にcreateviewを付与します
u2 / u2を接続します
テーブルu2.test(数値)を作成します
付与オプションを使用して、テスト時にselectをu1に付与します。
u1 / u1を接続します
ビューtestvをselect * fromu2.testとして作成します
testvでselectをシステムに付与する
u2 / u2を接続します
u1からテストの選択を取り消す
u1にselectontestを付与します
u1 / u1を接続します
ビューtestvをselect * fromu2.testとして作成または置換します

バージョン11.2.0.4(およびそれ以降)での結果は次のようになります。

ビューtestvをselect * fromu2.testとして作成または置換します
*
1行目のエラー。
ORA-01720: 'U2.TESTの付与オプションが存在しません

'

変更点

以前のバージョンから11.2.0.4にアップグレードします。

原因

観察された動作は正しいです。他のユーザーのテーブルから選択するビューを置き換えると、このORA-1720エラーが発生し、次の両方の条件が当てはまります。

-VIEWに対するselectまたはその他の権限を他のユーザーにすでに付与しています
-ビューの所有者は、選択されているテーブルにGRANTオプションを持っていません(または、ビューの所有者は、付与オプションを持つ特権を持っているが、他の特権を持っていない可能性があります)

開発はそれを次のように説明しています:

11.2.0.4でコードが変更され、ビューの作成動作が付与と同様になりました。既存のビューでGRANTを作成しようとし、ビューの所有者に付与オプションがない場合、ORA-1720が期待される結果になります(11.2.0.3でも)。 11.2.0.4では、CREATE VIEWをGRANTの動作と一致させるだけです。つまり、互換性のない許可が存在する場合は、新しいビュー定義を許可しないでください(FORCEを使用する場合でも)。つまり、互換性のない許可をビュー定義と共存させることは許可されていないため、エラーをスローする必要があります。リリース11.2.0.3(およびそれ以前)の動作は正しくありませんでした。11.2.0.4の新しい動作は意図的で正しいものです。

解決

この問題を回避するには、次のいずれかを実行できます。

1.ビューを置き換える前に、ビューのすべての許可を削除します。これにより、互換性のない許可が存在しないことが保証されます。
2.ビューをドロップして再作成します。ビューを削除すると、すべての許可が自動的に削除されます。

この状態のビューを検出するには、次のステートメントを使用できますが、検出されるのは第1レベルの依存関係のみであることに注意してください。

から一意のd.owner、d.name 'ビュー'を選択します
dba_dependencies d、dba_tab_privs pv、dba_tab_privs pd
どこ
-ビュー所有者のスキーマ外に依存関係があります
d.TYPE = 'VIEW'およびd.REFERENCED_OWNERd.owner
-ビューで発行された助成金があります
およびpv.TABLE_NAME = d.name
およびd.owner = pv.owner
およびpv.privilegein( 'SELECT'、 'INSERT'、 'UPDATE')
-依存オブジェクトは管理オプションで付与されていません
およびpd.TABLE_NAME = d.REFERENCED_NAME
およびpd.GRANTABLE = 'NO'
-役割への助成金の除外
およびpv.grantee'PUBLIC '
およびpd.grantee'PUBLIC '
およびpv.granteeがありません(dba_rolesから役割を選択してください)
およびpd.granteeがありません(dba_rolesから役割を選択してください)
-パブリック所有のオブジェクトを除外します
およびd.REFERENCED_OWNER'PUBLIC '

このドキュメントの上部にあるテストケースで使用すると、問題のあるビューを特定できます。

SQL> @view_check

オーナービュー
------------------------------ -------------------- ----------

U1 TESTV

私が抱えている問題は、ビューが他のユーザーに付与されることです。そのため、ビューを作成するときに、付与オプションを指定したリクエストが必要です。