データベースに無効なビューと関数がいくつかあります。
多くの人が同じデータベースで作業しているため、これらのオブジェクトが無効になった原因は何ですか。
どの変更が原因でビューが無効になったかを確認するにはどうすればよいですか?
つまり、いいえ。
ただし、DBA_DEPENDENCIES
viewを使用して、ビューと関数が依存しているオブジェクトを確認し、DBA_OBJECTS
をチェックしてlast_ddl_time
これらの依存オブジェクトのそれぞれについて-これにより、どのオブジェクトが変更され、結果としてビューが無効になったかを示すことができます。
列がテーブルなどに追加されると、オブジェクトが開発データベースで無効になるのはごく普通のことです。
フィルが言うように、あなたは本当にこれを遡及的にすることはできません。
ただし、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を再度実行することはできません!適切な特権を持つ他のユーザーは、トリガーを削除または再作成する必要があります。