为什么Oracle同义词会向基础表返回不同数量的行?
发布时间:2021-03-07 14:05:03 所属栏目:站长百科 来源:网络整理
导读:我有一个非常不寻常的情况,我希望有人能够阐明.我对oracle同义词的理解是它基本上是另一个模式中表的别名. 当我从同义词进行计数时,它返回零行.当我从基础表执行相同操作时,它返回12,000行. 我无法解释这种差异.有人可以帮忙吗? select * from dba_synonyms
我有一个非常不寻常的情况,我希望有人能够阐明.我对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 解决方法更新:您已启用 每次访问表时都会调用用户函数FND_GENERIC_POLICY.GET_PREDICATE,并限制对某些行的访问. 它会返回不同的结果,具体取决于您如何访问表:直接或通过SYNONYM. 您需要查看该函数并查看正在进行的操作(或在此处发布函数文本). (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |