오라클 동의어가 왜 다른 수의 행을 기본 테이블에 반환합니까?

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

  •  13-09-2019
  •  | 
  •  

문제

나는 누군가가 약간의 빛을 흘리기를 바라고있는 매우 특이한 상황을 가지고 있습니다. Oracle 동의어에 대한 나의 이해는 기본적으로 다른 스키마의 테이블에 대한 별칭이라는 것입니다.

동의어에서 카운트를 할 때 0 행을 반환합니다. 기본 테이블에서 똑같이 할 때 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