2013-02-20 2 views
2

У меня есть таблица user_synonyms, в которой я могу видеть имя, таблицу и владельца таблицы. Есть ли способ убедиться, что этот синоним все еще действителен i, e. если ссылочная таблица все еще существует, не пытаясь ее вручную?Как проверить все недействительные синонимы в Oracle

ответ

3

Вы можете проверить, существует ли таблица, присоединившись к ALL_TABLES (синоним может быть не в таблице в той же схеме).

select * 
    from all_synonyms s 
    left outer join all_tables t 
    on s.table_owner = t.owner 
    and s.table_name = t.table_name 
where s.owner = user 

Добавить условие and t.table_name is null если вы хотите, чтобы эти синонимы, если таблица не существует.

Если вы хотите проверить, является ли синоним VALID-запросом ALL_OBJECTS.

select * 
    from all_synonyms s 
    join all_objects o 
    on s.owner = o.owner 
    and s.synonym_name = o.object_name 
where o.object_type = 'SYNONYM' 
    and s.owner = user 
    and o.status <> 'VALID' 

Как a_horse_with_no_name указывает в комментариях нет никакого требования синонимом быть на столе, представления, последовательности даже пакеты корректными.

Таким образом, вы можете захотеть изменить первый запрос, чтобы искать их, а также:

select * 
    from all_synonyms s 
    join all_objects o 
    on s.table_owner = o.owner 
    and s.table_name = o.object_name 
where s.owner = user 
+0

Чтобы завершить картину: синоним не обязательно для таблицы. Таким образом, первый запрос может вызвать ложные негативы, если точки синонима, например. на вид или процедуру. –

+0

True @a_horse_with_no_name, сконцентрированный слишком много на вопросе. Я обновил свой ответ; Благодарю. – Ben

0

Используйте приведенный ниже запрос:

select s.table_owner, s.table_name 
from all_synonyms s, all_tables t 
where s.table_owner = t.owner(+) 
and s.table_name = t.table_name(+) 
and t.owner is null 
--s.owner = 'SCHEMA_NAME' 
; 
+0

Как @a_horse_with_no_name сказал в другом ответе, синоним не обязательно для таблицы. Таким образом, первый запрос может вызвать ложные негативы, если точки синонима, например. к просмотру или процедуре. – Krumia

0
select distinct os.* 
from all_objects os 
     ,all_synonyms s 
where 1 = 1 
and os.object_type = 'SYNONYM' 
and os.STATUS  = 'INVALID' 
and os.object_name = s.synonym_name 
and not exists  (select unique(1) 
         from all_objects o1 
         where o1.object_name = s.TABLE_NAME 
         and o1.owner  = s.TABLE_OWNER) 
order by 2; 
+0

Вы должны дать некоторое описание –

Смежные вопросы