Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Oracle同义词会向基础表返回不同数量的行?_Oracle_Synonym - Fatal编程技术网

为什么Oracle同义词会向基础表返回不同数量的行?

为什么Oracle同义词会向基础表返回不同数量的行?,oracle,synonym,Oracle,Synonym,我有一个非常不寻常的情况,我希望有人能解释一下。我对oracle同义词的理解是,它基本上是另一个模式中表的别名 当我对同义词进行计数时,它返回零行。当我对基础表执行相同操作时,它返回12000行 我无法解释这种差异。有人能帮忙吗 select * from dba_synonyms where synonym_name = 'CS_INCIDENTS_B_SEC'; OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_L

我有一个非常不寻常的情况,我希望有人能解释一下。我对oracle同义词的理解是,它基本上是另一个模式中表的别名

当我对同义词进行计数时,它返回零行。当我对基础表执行相同操作时,它返回12000行

我无法解释这种差异。有人能帮忙吗

select * from dba_synonyms
where synonym_name = 'CS_INCIDENTS_B_SEC';

OWNER  SYNONYM_NAME        TABLE_OWNER  TABLE_NAME          DB_LINK
------ ------------------- ------------ ------------------- -------
APPS   CS_INCIDENTS_B_SEC  CS           CS_INCIDENTS_ALL_B         



select count(*) from CS.CS_INCIDENTS_ALL_B;

COUNT(*)               
---------------------- 
12549                  

select count(*) from APPS.CS_INCIDENTS_B_SEC;

COUNT(*)               
---------------------- 
0                      
解释计划:

直接放在桌子上

EXPLAIN PLAN FOR
SELECT  *
FROM    CS.CS_INCIDENTS_ALL_B

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
| Id  | Operation         | Name               | Rows | Bytes| Cost(%CPU)|
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                    | 6056 | 1549K|  122   (3)|
|   1 |  TABLE ACCESS FULL| CS_INCIDENTS_ALL_B | 6056 | 1549K|  122   (3)|
--------------------------------------------------------------------------
通过同义词

EXPLAIN PLAN FOR
SELECT  *
FROM    APPS.CS_INCIDENTS_B_SEC

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
| Id  | Operation          | Name               | Rows | Bytes| Cost(%CPU)|
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                    |    1 |  262 |    0   (0)|
|*  1 |  FILTER            |                    |      |      |           |
|   2 |   TABLE ACCESS FULL| CS_INCIDENTS_ALL_B | 6056 | 1549K|  122   (3)|
---------------------------------------------------------------------------

1 - filter(NULL IS NOT NULL)
同义词链

SQL> SELECT  *
  2  FROM    dba_synonyms
  3  START WITH
  4          owner = 'CS'
  5          AND synonym_name = 'CS_INCIDENTS_ALL_B'
  6  CONNECT BY
  7          owner = PRIOR table_owner
  8          AND synonym_name = PRIOR table_name
  9  /

no rows selected

SQL> SELECT  *
  2  FROM    dba_synonyms
  3  START WITH
  4          owner = 'APPS'
  5          AND synonym_name = 'CS_INCIDENTS_B_SEC'
  6  CONNECT BY
  7          owner = PRIOR table_owner
  8          AND synonym_name = PRIOR table_name
  9  /
正在检查数据库上的策略

SQL> SELECT *
  2  FROM dba_policies
  3  WHERE OBJECT_NAME = 'CS_INCIDENTS_B_SEC'
  4  /

OBJECT_OWNER  OBJECT_NAME         POLICY_GROUP  POLICY_NAME          
------------- ------------------- ------------- -------------------- 
APPS          CS_INCIDENTS_B_SEC  SYS_DEFAULT   CS_SR_SEC_SR_ACCESS  


PF_OWNER  PACKAGE            FUNCTION       SEL INS UPD DEL IDX CHK 
--------- ------------------ -------------- --- --- --- --- --- --- 
APPS      FND_GENERIC_POLICY GET_PREDICATE  YES NO  NO  NO  NO  NO  


ENABLE STATIC_POLICY POLICY_TYPE  LONG_PREDICATE
------ ------------- ------------ --------------
YES    NO            DYNAMIC      YES

您是否100%确定
CS.CS\u events\u ALL\u B
实际上是一个表而不是一个视图?如果它是一个视图,那么它可能在WHERE子句中做了一些相当不寻常的事情

select object_type from dba_objects where owner = 'CS' and object_name = 'CS_INCIDENTS_ALL_B'

更新:

您已启用

每次访问表时都会调用用户函数
FND\u GENERIC\u POLICY.GET\u PREDICATE
,并限制对某些行的访问

它会返回不同的结果,具体取决于您如何访问该表:直接访问还是通过
同义词访问


您需要查看函数并查看发生了什么(或在此处发布函数文本)。

检查以确保应用程序拥有的其他对象(视图或表)与您的同义词同名

select object_type,object_name
from   dba_objects
where  object_name='CS_INCIDENTS_B_SEC'
and    owner='APPS'
and    object_type!='SYNONYM'

哇!这很奇怪。好了,不应该返回不同的行数或行数…但希望看到答案…:-)您可以发布这两个查询的查询计划吗?您似乎在此表上启用了行级安全性。你能从我的帖子中运行查询吗?+1,有趣的问题。对于那些觉得这个问题很有趣的人来说,为什么你没有投票呢?我知道有一个同义词叫做APPS.CS_events_ALL_B,但它在APPS模式中,并且指向CS.CS_events_ALL_B。绝对肯定。该查询返回“TABLE”。不。该查询没有返回任何内容。