我有一个非常不寻常的情况,我希望有人能够阐明.我对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.
您需要查看该函数并查看正在进行的操作(或在此处发布函数文本).