오라클 동의어가 왜 다른 수의 행을 기본 테이블에 반환합니까?
문제
나는 누군가가 약간의 빛을 흘리기를 바라고있는 매우 특이한 상황을 가지고 있습니다. 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'
제휴하지 않습니다 StackOverflow