Таблица и синоним одной и той же таблицы дают разные результаты

В OracleEBS есть такие модули, как AP, AR, XLA и т. д. Каждый модуль имеет свою собственную схему, названную так же, как имя соответствующего модуля. Также есть схема APPS. Вы можете получить доступ к разным таблицам из другой схемы через синоним для этих объектов, созданных в схеме APPS. Например, в схеме xla есть таблица с именем xla.xla_transaction_entities, и эта таблица имеет синоним в схеме приложений. То есть следующие два запроса на выборку должны давать идентичный набор результатов:

select distinct entity_code from xla.xla_transaction_entities

а также

select distinct entity_code from apps.xla_transaction_entities

Однако второй запрос дал меньше результатов, чем первый. Затем я удалил и воссоздал синоним apps.xla_transaction_entities. Только после повторного создания синонима два приведенных выше запроса дали идентичные наборы результатов. Вопрос в том, почему это произойдет? Что заставило синоним давать другой набор результатов? Насколько я знаю, синонимы - это просто синонимы. Как следует из названия, они должны создавать тот же набор результатов, что и соответствующие им таблицы.

Изменить: в другом тестовом экземпляре я воспроизвел ту же проблему:

select distinct entity_code from apps.xla_transaction_entities

производит следующее:

THIRD_PARTY_MERGE
MANUAL
INTER_ASSET_TRANSACTIONS
TRANSACTIONS
DEPRECIATION

select distinct entity_code from xla.xla_transaction_entities

производит следующее:

AP_PAYMENTS
RCV_ACCOUNTING_EVENTS
THIRD_PARTY_MERGE
MANUAL
ADJUSTMENTS
PURCHASE_ORDER
MTL_ACCOUNTING_EVENTS
RECEIPTS
INTER_ASSET_TRANSACTIONS
AP_INVOICES
TRANSACTIONS
DEPRECIATION

  select * from dba_synonyms
  where synonym_name = 'XLA_TRANSACTION_ENTITIES'

дает мне следующее:

OWNER   SYNONYM_NAME              TABLE_OWNER   TABLE_NAME,               DB_LINK
APPS    XLA_TRANSACTION_ENTITIES  XLA           XLA_TRANSACTION_ENTITIES

select * from dba_synonyms
where TABLE_NAME = 'XLA_TRANSACTION_ENTITIES'

выводит следующее:

OWNER    SYNONYM_NAME                   TABLE_OWNER    TABLE_NAME               DB_LINK
APPS     XLA_TRANSACTION_ENTITIES       XLA            XLA_TRANSACTION_ENTITIES
APPS     XLA_TRANSACTION_ENTITIES_UPG   XLA            XLA_TRANSACTION_ENTITIES

Итак, вы видите, что APPS.XLA_TRANSACTION_ENTITES указывает на XLA.XLA_TRANSACTION_ENTITIES. И снова, как только я воссоздаю синоним, проблема исчезает. Причина, по которой это меня так беспокоит, заключается в том, что в большинстве настраиваемых отчетов, которые мы закодировали, использовались синонимы вместо реальных имен таблиц. Итак, мне интересно, если я не воссоздам все синонимы в схеме APPS, проблема сохранится или нет.


person Ahmedov    schedule 15.07.2014    source источник
comment
Перед удалением и воссозданием синонима было бы целесообразно проверить DBA_SYNONYMS, чтобы увидеть, на что он указывает, тогда это могло бы пролить свет на этот вопрос.   -  person TenG    schedule 15.07.2014
comment
Необходимая информация предоставляется в виде редакции вопроса.   -  person Ahmedov    schedule 15.07.2014
comment
Моя точка зрения заключалась в том, чтобы в будущем просмотреть эти данные до того, как синоним будет удален, если что-то подобное произойдет снова. Что касается остальных, вы, возможно, могли бы проверить все строки в DBA_SYNONYMS, где синоним_имя != имя_таблицы в качестве начала.   -  person TenG    schedule 15.07.2014
comment
Приложения Oracle используют мелкозернистый контроль доступа (он же виртуальная частная база данных). Общая конструкция заключается в том, что контекст приложения устанавливается пользователем приложений Oracle во время входа в систему и имеет политику безопасности.   -  person Patrick Bacon    schedule 15.07.2014


Ответы (3)


Для некоторых таблиц в приложениях Oracle включен VPD. По этой ссылке вы можете найти дополнительную информацию

Are you using MO view like ap_invoices?
  For all org_ids' data      -> Use `ap_invoices_all`
  For specific org_id's data -> 11i -> `dbms_application_info.set_client_info(&org_id);`
                                R12 -> `mo_global.set_policy_context('S',&org_id);`

Are you using VPD enabled tables like xla_transaction_entities?
  For specific application's data -> xla_security_pkg.set_security_context(&appl_id);
  For all applications' data      -> xla_security_pkg.set_security_context(602);
                                    (Or) Use xla.xla_transaction_entities
                                    (Or) Use xla_transaction_entities_upg
person Ahmedov    schedule 16.07.2014

Для таблицы xla_transaction_entities включена VPD (виртуальная частная база данных) .

VPD — это функция безопасности, которая позволяет пользователю ограничивать доступ к данным из базы данных на уровне базы данных. Предположим, пользователю разрешено извлекать данные из приложения, но он может использовать такие инструменты, как SQLPlus, для извлечения данных из таблицы. Чтобы ограничить это, администратор безопасности добавляет уровень безопасности (один из 3 типов), чтобы не извлекаться все строки/столбцы.

поэтому вместо использования apps.xla_transaction_entities используйте xla.xla_transaction_entities.

для получения дополнительной информации о VPD

person akshay    schedule 05.12.2017

Другим решением этой проблемы является использование синонима apps.xla_transaction_entities_upg.

Это не требует от нас обхода настроек безопасности, установленных на xla_transaction_entities.

Источник - Металинк Примечание: 2110926.1

person Sudipta Mondal    schedule 14.02.2018