「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」を付与してみてください。