【S2JDBC-Gen】「Gen-Entity」で「ORA-01031」が発生する問題解決方法の紹介

S2JDBC-Gen」の「Gen-Entity」を使用してエンティティクラスのコード情報を生成する時に、「Oracle Database」を使用している場合は「ORA-01031:権限が不足しています。」というエラーが発生することがあります。

「権限が不足しています。」というエラー情報のため、「権限不足」に関連する接続情報などに不備があると考えて、以下に記載する状態を確認してもエラーが発生することがあります。

  • 接続情報の「ユーザー名/パスワード」が正しいこと。
  • コード情報を生成する対象テーブルにアクセスできること。

今回は、このような状態でも「ORA-01031:権限が不足しています。」が発生する原因と問題解決方法を紹介していきます。

スポンサーリンク

環境

検証に使用した実行環境を以下に記載します。

  • Java:8
  • Apache Ant:1.10.5
  • S2JDBC-Gen:2.4.48
  • Oracle Database JDBCドライバ:11.1.0.7.0

「ORA-01031」が発生する原因について

「ORA-01031」が発生する原因は、データベースの「メタ情報」を取得する権限が不足しているため発生します。

「Gen-Entity」を実行したときに以下のエラー内容が出力されている場合は、「メタ情報」を取得する権限が不足している可能性が高いです。

Caused by: org.seasar.framework.exception.SQLRuntimeException:
 [ESSR0072]SQLで例外(SQL=[], Message=[ORA-01031: 権限が不足しています。
(中略)
org.seasar.extension.jdbc.gen.internal.meta.DbTableMetaReaderImpl.getDbUniqueKeyMetaList
 (DbTableMetaReaderImpl.java:426)

※「メタ情報」とは、データベースの構造(スキーマ属性、型属性など)の定義している情報になります。

データベースの「メタ情報」の取得は、エラーが発生した箇所の「getIndexInfo」の呼び出し先で、以下に記載するようなSQLを実行しているためです。

analyze table テーブル名 compute statistics;

このため、「analyze table」を実行するための権限が不足しているエラーとして「ORA-01031」が発生するということになります。

「ORA-01031」が発生する問題解決方法について

「ORA-01031」が発生する問題解決方法は、原因に記載した「メタ情報」を取得する「analyze table」を実行するために「ANALYZE ANY」の権限を付与する必要があります。権限付与は、以下に記載するSQLを実行します。

GRANT ANALYZE ANY TO ユーザー名;

権限付与されている状態で「Gen-Entity」を実行します。無事にエンティティクラスのコード情報が生成できたと思います。

付与した権限が不要な場合は、設定後に削除しても問題はありません。ただし、再度、「Gen-Entity」を実行すると「ORA-01031」が発生するため注意してください。権限削除は、以下に記載するSQLを実行します。

REVOKE ANALYZE ANY TO ユーザー名;

まとめ

「Gen-Entity」の実行するときに「ORA-01031」が発生する場合は、「システム権限」の「ANALYZE ANY」を付与してみてください。