【问题标题】:Why do queries against this synonym return no records when queries against its referenced table do?为什么在针对其引用的表进行查询时,针对该同义词的查询不返回任何记录?
【发布时间】:2011-04-05 00:09:54
【问题描述】:

我有一个名为AP.AP_BATCHES_ALL的表:

SELECT
  OWNER,
  OBJECT_NAME,
  OBJECT_TYPE
FROM
  ALL_OBJECTS
WHERE
  OWNER = 'AP' AND OBJECT_NAME = 'AP_BATCHES_ALL'
+-------+----------------+-------------+ |所有者 |对象名 |对象类型 | +-------+----------------+-------------+ |美联社 | AP_BATCHES_ALL |表 | +-------+----------------+-------------+

我可以查询这张表:

SELECT * FROM AP.AP_BATCHES_ALL

返回 200,000+ 条记录。

现在,有一个名为 APPS.AP_BATCHES 的同义词引用了前面提到的 AP.AP_BATCHES_ALL 表:

SELECT * FROM ALL_SYNONYMS WHERE OWNER = 'APPS' AND SYNONYM_NAME = 'AP_BATCHES'
+-------+-------------+-------------+------------ ----+----------+ |所有者 | SYNONYM_NAME |表所有者 |表名 | DB_LINK | +-------+-------------+-------------+------------ ----+----------+ |应用程序 | AP_BATCHES |美联社 | AP_BATCHES_ALL | | +-------+-------------+-------------+------------ ----+----------+

现在,当我查询 APPS.AP_BATCHES(同义词)时,我得到 no 记录:

SELECT * FROM APPS.AP_BATCHES

没有记录返回,即使 APPS.AP_BATCHES 只是 AP.AP_BATCHES_ALL 的同义词(包含 200,000 多条记录的表)。

为什么查询同义词不返回记录,而查询引用的表

【问题讨论】:

  • APPS.AP_BATCHES 上是否有任何策略(DBMS_RLS,另见 v$vpd_policies)?
  • @Vincent:你读懂了我的想法。把它变成一个答案,我会给你信用。

标签: sql oracle


【解决方案1】:

起初我以为您遇到了视图和公共同义词之间的阴影问题。但是,这里不是这种情况,因为 APPS 只能拥有一个名为 AP_BATCHES(同义词)的对象。

是否会在此同义词上定义行级策略 (v$vpd_policies)?

顺便说一句,我不知道 (1) 您可以向同义词添加策略以及 (2) 版本 12 正在使用它们。

【讨论】:

  • 感谢您的提示。我知道APPS.AP_BATCHES 通常是 Release 11 中的视图。但是,我正在使用 Release 12,其中架构经历了一些手术。我执行了您的查询,唯一名为 AP_BATCHES 的对象是我在问题中提到的 APPS.AP_BATCHES 同义词。
  • @adam:我也应该在您的示例中看到您已指定所有者(并且 APPS 不能同时拥有视图和具有相同名称的同义词)
  • 你说得对,Release 12 在它的许多同义词上使用了行级安全性(奇怪但真实)。一个常用的策略被命名为ORG_SEC (organization security?),它引入了以下谓词:1=2。这有效地防止了同义词检索记录。非常非常奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多