2023年6月6日火曜日

Autonomous Databaseでインバリッド・オブジェクトの一括コンパイルする

 Always FreeのAutonomous DatabaseのAPEXを23.1にアップグレードしたところ、Flows for APEXやサンプル・アプリケーションのビューやパッケージのステータスが軒並みインバリッドになっていました。

放っておいても初回アクセス時に自動コンパイルされバリッドに戻るとは思うのですが、そもそもAutonomous Databaseでインバリッド・オブジェクトの一括コンパイルを行う手順が分からなかったので調べてみました。

オンプレミスの環境では、$ORACLE_HOME/rdbms/admin/utlrp.sqlを実行するのが一般的だと思います。

ORACLE-BASEの以下の記事を参考にしました。

Recompiling Invalid Schema Objects

インバリッド・オブジェクトを確認します。

APEXから操作することを想定して、DBA_OBJECTSではなくALL_OBJECTSを検索します。

select owner, object_type, object_name, status from all_objects where status = 'INVALID' order by 1,2,3;


元記事にあるマニュアルの手順およびutlrp.sqlとutlprp.sqlの実行は、検討の対象外です。残りはパッケージUTL_RECOMPとDBMS_UTILITYの利用になります。

UTL_RECOMPについてはAPEXのワークスペース・スキーマは実行権限が与えられていないようです。呼び出すには管理者ユーザーADMINで実行権限を与える必要があります。

grant execute on sys.utl_recomp to <APEXのワークスペース・スキーマ>;


実行権限が与えられていれば、APEXのSQLコマンドからUTL_RECOMPを呼び出すことができます。SYSでパッケージ名を修飾する必要があります。

begin
sys.utl_recomp.recomp_serial(schema => 'スキーマ名');
end;


しかし管理者ユーザーがgrant文を実行するなら、そのままリコンパイルした方が早いです。

DBMS_UTILITY.COMPILE_SCHEMAは、デフォルトで実行権限が割り当たっているようです。APEXからであれば、こちらを使ってインバリッド・オブジェクトの一括コンパイルを行う方が簡単です。

begin
dbms_utility.compile_schema(schema => 'スキーマ名');
end;


以上になります。