【问题标题】:Table and Synonym of the same table produce different results同一个表的表和同义词产生不同的结果
【发布时间】:2014-09-05 12:14:03
【问题描述】:

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

【问题讨论】:

  • 在删除和重新创建同义词之前,最好检查 DBA_SYNONYMS 以查看它所指向的内容,这样可能会阐明问题。
  • 必填信息作为问题的版本提供。
  • 我的意思是,如果再次发生类似情况,请在删除同义词之前查看此数据以供将来参考。至于其余的,您也许可以检查 DBA_SYNONYMS 中以 synonym_name != table_name 开头的所有行。
  • Oracle 应用程序使用细粒度访问控制(也称为虚拟私有数据库)。一般构造是应用程序上下文由 Oracle 应用程序用户在登录时设置,并且它具有安全策略。

标签: sql oracle erp row-level-security


【解决方案1】:

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

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

来源 - Metalink 注:2110926.1

【讨论】:

    【解决方案2】:

    xla_transaction_entities 表是VPD(Virtual Private Database)启用。

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

    所以不要使用apps.xla_transaction_entities,而是使用xla.xla_transaction_entities

    more info on VPD

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2018-05-23
        相关资源
        最近更新 更多