表和同一表的同义词产生不同的结果

时间:2014-07-15 10:29:56

标签: sql oracle erp row-level-security

在OracleEBS中,有AP,AR,XLA等模块。每个模块都有自己的模式,名称与相应的模块名称相同。还有APPS架构。您可以通过APPS模式中创建的对象的同义词访问不同模式的不同表。例如,xla架构中有一个名为xla.xla_transaction_entities的表,该表在apps架构中具有同义词。这样,以下两个选择查询应该生成相同的结果集:

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模式中重新创建所有同义词,否则问题是否会持续存在。

3 个答案:

答案 0 :(得分:1)

Oracle应用程序中的某些表启用了VPD。 In this link you can find additional information

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

答案 1 :(得分:0)

xla_transaction_entities表是 VPD(虚拟专用数据库)启用。

VPD 是一项安全功能,允许用户在数据库级别限制从数据库访问数据。假设用户被限制从应用程序获取数据,但他可以使用SQLPlus之类的工具从表中获取数据。要对此进行限制,安全管理员会添加安全级别(3种类型之一) 并不是所有的行/列都被提取。

所以不要使用apps.xla_transaction_entities使用xla.xla_transaction_entities

for more info on VPD

答案 2 :(得分:0)

此问题的另一个解决方案是使用同义词apps.xla_transaction_entities_upg

这不要求我们绕过xla_transaction_entities上设置的安全设置。

来源 - Metalink注:2110926.1