web-dev-qa-db-ja.com

Oracleデータベースでオブジェクトが無効になる理由。

データベースに無効なビューと関数がいくつかあります。

多くの人が同じデータベースで作業しているため、これらのオブジェクトが無効になった原因は何ですか。

どの変更が原因でビューが無効になったかを確認するにはどうすればよいですか?

4

つまり、いいえ。

ただし、DBA_DEPENDENCIES viewを使用して、ビューと関数が依存しているオブジェクトを確認し、DBA_OBJECTSをチェックしてlast_ddl_timeこれらの依存オブジェクトのそれぞれについて-これにより、どのオブジェクトが変更され、結果としてビューが無効になったかを示すことができます。

列がテーブルなどに追加されると、オブジェクトが開発データベースで無効になるのはごく普通のことです。

6
Philᵀᴹ

フィルが言うように、あなたは本当にこれを遡及的にすることはできません。

ただし、DDLトリガーを作成して、将来これをキャプチャすることができます。これらはDDLイベントの前後に発生し、テーブルへの依存関係をキャプチャできます。

create table invalidations (
  operation           varchar2(30),
  invalidating_object varchar2(30),
  invalidating_owner  varchar2(30),
  invalidated_object  varchar2(30),
  invalidated_owner   varchar2(30),
  invalidation_date   date
);

create or replace trigger befddl_trg
before ddl
on schema
declare
begin
  insert into invalidations
  select ora_sysevent, ora_dict_obj_name, ora_dict_obj_owner, d.name, d.owner, sysdate
  from   all_dependencies d 
  where  referenced_name = ora_dict_obj_name 
  and    referenced_owner = ora_dict_obj_owner;

end befddl_trg;
/

create table t1 (x integer);

create view v1 as
  select * from t1;

create or replace procedure prc as 
begin
  for c in (select * from t1) loop
    null;
  end loop;
end;
/

alter table t1 add y integer;

select invalidated_object || ' was invalidated by ' || invalidating_object || ' at ' || 
       to_char(invalidation_date, 'dd/mm/yyyy hh24:mi') output 
from   invalidations;

OUTPUT
-------------------------------------------------
V1 was invalidated by T1 at 15/10/2012 17:21
PRC was invalidated by T1 at 15/10/2012 17:21

オブジェクトが依存関係としてリストされているからといって、ベースオブジェクトを変更したときにオブジェクトが無効になるとは限りません。これは、11gでは依存関係が細かくなり、可能性が高まります。したがって、これを拡張してALL_OBJECTS.STATUSフィールドをチェックし、依存関係が実際に無効化されているかどうかをチェックし、すでに無効であるかどうかをチェックする必要があります。どれだけ拡張する必要があるかは、「無効化機能」が何であるかを知る必要がある理由によって異なります。

警告の言葉-BEFDDL_TRGを(恒久的に)無効にした場合(INVALIDATIONSテーブルを削除するなどして)、スキーマ内のDDLを再度実行することはできません!適切な特権を持つ他のユーザーは、トリガーを削除または再作成する必要があります。

3
Chris Saxon