Public synonyms do not have to have an owner qualification in the target object. For example.
Hint: When I say "For example", it means "Here is the test case you should have provided, which probably might have answered your question anyway :-)
--
-- source db
--
SQL> grant create session, create database link, create public synonym to craig identified by craig;
Grant succeeded.
SQL> grant create session, create database link to denver identified by denver;
Grant succeeded.
--
-- target db
--
SQL> grant create session to craig identified by craig;
Grant succeeded.
SQL> grant create session to denver identified by denver;
Grant succeeded.
--
-- source db
--
SQL> conn craig/craig
Connected.
SQL> create database link foo using 'db122';
Database link created.
SQL> select * from tab@foo;
no rows selected
SQL> create public synonym fooaudit for tab@foo;
Synonym created.
SQL> select * from fooaudit;
no rows selected
SQL> conn denver/denver
Connected.
SQL> create database link foo using 'db122';
Database link created.
SQL> select * from tab@foo;
no rows selected
--
-- Now you might think that this would fail.
-- After all, DENVER does not have access to CRAIG's objects
--
-- but it works
--
SQL> select * from fooaudit;
no rows selected
We can see the *why* by looking at the synonym definition
SQL> select * from dba_synonyms
2 where synonym_name like 'FOO%'
3 @pr
==============================
OWNER : PUBLIC
SYNONYM_NAME : FOOAUDIT
TABLE_OWNER :
TABLE_NAME : TAB
DB_LINK : FOO
ORIGIN_CON_ID : 0
The TABLE_OWNER is null, we'll use "DENVER" in the last case.
If you fully qualify the synonym, you'll get the expected results
SQL> drop public synonym fooaudit;
Synonym dropped.
SQL> create public synonym fooaudit for craig.my_table@foo;
Synonym created.
SQL> conn denver/denver
Connected.
SQL> select * from fooaudit;
select * from fooaudit
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-02063: preceding line from FOO
SQL> conn craig/craig
Connected.
SQL> select * from fooaudit;
no rows selected