Oracle シノニムが基になるテーブルに異なる行数を返すのはなぜですか?
質問
私には非常に珍しい状況があり、誰かが光を当ててくれることを願っています。オラクルのシノニムについての私の理解は、基本的には別のスキーマ内のテーブルのエイリアスであるということです。
シノニムからカウントを実行すると、ゼロ行が返されます。基になるテーブルから同じことを実行すると、12,000 行が返されます。
この矛盾を説明することはできません。誰か助けてくれませんか?
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
.
関数を調べて何が起こっているのかを確認する必要があります (または関数のテキストをここに投稿します)。
他のヒント
あなたはCS.CS_INCIDENTS_ALL_B
が、実際には、テーブルではなくビューであることを100%か?それはビューである場合は、おそらくそれは、そのWHERE句でかなり珍しい何かをやっている。
select object_type from dba_objects where owner = 'CS' and object_name = 'CS_INCIDENTS_ALL_B'
あなたの同義語と同じ名前を持つAPPSが所有する他のオブジェクト(ビューまたはテーブル)がないことを確認するチェックします。
select object_type,object_name
from dba_objects
where object_name='CS_INCIDENTS_B_SEC'
and owner='APPS'
and object_type!='SYNONYM'
所属していません StackOverflow