Почему синоним Oracle возвращает другое количество строк в базовую таблицу?

StackOverflow https://stackoverflow.com/questions/781224

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня очень необычная ситуация, на которую, я надеюсь, кто-нибудь сможет пролить некоторый свет.Мое понимание синонима oracle заключается в том, что это в основном псевдоним таблицы в другой схеме.

Когда я выполняю подсчет из синонима, он возвращает нулевые строки.Когда я делаю то же самое из базовой таблицы, она возвращает 12 тысяч строк.

Я не могу объяснить это несоответствие.Кто-нибудь может помочь?

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
Это было полезно?

Решение

Обновить:

У вас есть ROW LEVEL SECURITY включен.

Пользовательская функция FND_GENERIC_POLICY.GET_PREDICATE вызывается каждый раз, когда вы обращаетесь к таблице, и ограничивает доступ к некоторым строкам.

Он возвращает разные результаты в зависимости от того, как вы получаете доступ к таблице:непосредственно или через SYNONYM.

Вам нужно будет заглянуть в функцию и посмотреть, что происходит (или опубликовать текст функции здесь).

Другие советы

Вы на 100% уверены, что CS.CS_INCIDENTS_ALL_B является ли это, по сути, таблицей, а не представлением?Если это представление, возможно, оно делает что-то довольно необычное в своем предложении WHERE .

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

Убедитесь, что нет других объектов (представления или таблицы), принадлежащих приложениям с тем же именем, что и ваш синоним.

select object_type,object_name
from   dba_objects
where  object_name='CS_INCIDENTS_B_SEC'
and    owner='APPS'
and    object_type!='SYNONYM'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top