As Phil says, you can't really to this retrospectively.
You can create DDL triggers to capture this in the future however. These will fire before/after a DDL event, allowing you to capture the dependencies to a table:
create table invalidations (
create or replace trigger befddl_trg
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;
create table t1 (x integer);
create view v1 as
select * from t1;
create or replace procedure prc as
for c in (select * from t1) loop
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
V1 was invalidated by T1 at 15/10/2012 17:21
PRC was invalidated by T1 at 15/10/2012 17:21
Note that just because an object is listed as a dependency, doesn't necessarily mean it'll be invalidated when you modify the base object. This becomes more likely in 11g with its finer-grained dependencies. So you'll need to extend this to check the
ALL_OBJECTS.STATUS field to check whether whether you have actually invalidated the dependencies, with checks as to whether it was already invalid. How far you need to extend depends upon why you need to know what the "invalidator" was.
A word of warning - if you manage to (permanently) invalidate the
BEFDDL_TRG (e.g. by dropping the
INVALIDATIONS table), you won't be able to run any DDL in the schema again! A suitably privileged other user will have to drop/recreate the trigger for you.