2016-04-15 2 views
3

Ниже запрос я использовал для анализа недействительных объектов DBA из DBA_OBJECTS в базе данных и его возвращение с недопустимыми объектами:разница между Синонимами в оракуле

select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from dba_objects do 
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID' 
AND do.owner in ('AD','BD','DR','CD') 

Ниже Опросить я использовал для анализа недопустимого дБ объекты sys.dba_objects и его возвращение нуль:

select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from sys.dba_objects do 
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID' 
AND do.owner in ('AD','BD','DR','CD') 

почему первый запрос возвращает результаты с недопустимым телом пакета и почему второй запрос не возвращает никакого результата

+0

Является ли результат постоянным? Я имею в виду, что вы выполняете этот запрос один за другим, и результат такой же? Вы выполняете этот запрос под тем же пользователем? – JSapkota

+0

Можете ли вы рассказать, что дает этот запрос: выберите * from all_synonyms, где синоним_имя = 'DBA_OBJECTS' – Mottor

+0

@JSapkota результат такой же, почему я не понимаю разницу между этими походами. – Andrew

ответ

4

Правила для разрешения имен are described in the documentation.

При выполнении запроса от sys.dba_objects вы получаете прямой доступ к представлению SYS под названием dba_objects. Когда вы выполняете свой запрос против , который имеет неквалифицированныйdba_objects, вы можете получить доступ к таблице или представлению, которое у вас есть, или к объекту, которому вы или кто-то еще владеете, через частный синоним (который вы имеете) или публичный синоним.

Обычно существует только публичный синоним для изображений dba_*, а это означает, что если вы ссылаетесь на dba_objects, то вы по-прежнему на самом деле смотрите на sys.dba_objects через этот общедоступный синоним по умолчанию.

В вашем случае у двух пользователей есть личные синонимы с тем же именем. Если вы подключены как READ_ONLY или RM2_READ_ONLY, тогда будут использоваться синонимы этих пользователей; поэтому, когда вы ссылаетесь на dba_objects, вы фактически смотрите на o2support.rm_dba_objects, который - по результатам, которые вы получаете - полностью не связан с текущим содержимым sys.dba_objects.

Резюмируя: у вас есть частный синоним, который берет верх над общественной один, а два утверждения запросов различных таблиц.

Я бы предположил, что это ранний снимок объектов в системе, возможно - из названия - объектов, которые должны были быть удалены, возможно, в качестве ссылки для их восстановления, если это необходимо. Как бы то ни было, он устарел, и вы, похоже, не хотите видеть его содержимое.

Если вы хотите увидеть текущий словарь данных, вам придется продолжать явно ссылаться на sys.dba_objects или посмотреть, можно ли безопасно удалить частные синонимы.

(Это не очень полезно, но вы можете также явно относятся к общественному синонима, но владелец должен поставляться в кавычках идентификатор, т.е. "PUBLIC".dba_objects Там нет никакой пользы в этом, что со ссылкой непосредственно sys.dba_objects хотя. .)

+0

ohh ok теперь я понял и почему, когда я спрашиваю, используя sys.dba_objects, он не проверяет объекты из o2support.rm_dba_objects и не возвращает результаты правы? – Andrew

+0

@Amit - правильно, он будет рассматривать только 'sys.dba_objects' или .'o2support.rm_dba_objects', в зависимости от того, является ли он квалифицированным или использует синоним, но не тот и другой. В вашем вопросе у вас есть это наоборот - 'sys' нашел данные, неквалифицированный не сделал; но это не имеет значения, результаты все равно разные, потому что вы получаете доступ к различным таблицам. –

+0

Поскольку 'o2support.rm_dba_objects' имеет запись для пакета и показывает его как INVALID; но 'sys.dba_objects' либо вообще не имеет записи, либо показывает ее как VALID. Запросите обе таблицы/представления, используя имя пакета, чтобы увидеть, что каждый показывает. Я не вижу ваши таблицы/представления, поэтому я не знаю, что в них, и я не знаю, почему у вас есть эта отдельная таблица/синоним, или когда/почему он был заполнен. Предположительно, это была копия реальных 'sys.dba_objects', взятых, когда пакет был признан недействительным, возможно, изменив или удалив зависимость, но мне неизвестно, что произошло в вашей системе. –

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