Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
есть такой неприятный момент в работе:
CREATE PUBLIC SYNONYM rasu_xx_xxx FOR rasu.xx_xxx@dblinkname_O.WORLD;
Запросы из него в SQL идут нормально
Запросы из него в PL/SQL идут нормально
НО: при компиляции пакетов PL/SQL смотрит на этот объект, но по другому линку dblinkname_D.WORLD (тестовая база)
Причем именно по линку: если перебить линк, чтобы смотрел на другую базу, где этого объекта нет, компиляция вообще не происходит (нет объекта)
Как это может быть и куда можно посмотреть?
15 июн 06, 12:25    [2773991]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
SELECT * FROM all_objects
WHERE UPPER(object_name) = UPPER('rasu_xx_xxx')
выдает всего одну честную строчку
15 июн 06, 12:44    [2774136]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
нашёл такую фигню:
в sys.obj$ лежат две ссылки: и на rasu.xx_xxx@dblinkname_O.WORLD, и на rasu.xx_xxx@dblinkname_D.WORLD:
Obj#NameRemoteOwnerLinkNameOwnerType
16974xx_xxxrasudblinkname_O.WORLD02
21104xx_xxxrasudblinkname_D.WORLD02
и еще два объекта, похожих на имеющих отношение к делу
Obj#NameRemoteOwnerLinkNameOwnerType
16927rasu_xx_xxx15
16973rasu_xx_xxx2010
Но что такое Type=10?
Я не системщик и не ДБА....

В sys.SYN$ вот что:
ObjNodeOwnerName
9030dblinkname_O.WORLDrasuxx_xxx
16927dblinkname_O.WORLDrasuxx_xxx
21102dblinkname_O.WORLDrasuxx_xxx
Связка одна - по 16927.

Неужели никто не подскажет?
15 июн 06, 17:13    [2776157]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
andreymx
Но что такое Type=10?


When object is dropped, the corresponding row in SYS.OBJ$ is not deleted but rather reclassified as type# = 10 (non-existent). This is done for performance. It stops obj$ table and its index degenerating over time in systems where objects are frequently dropped and created. Another case of non-existent type usage is related to 'negative dependency' tracking. Oracle will create objects of non-existent type specifically to handle 'negative dependency'. For example, you have a view defined by

	create or replace view v1 as 
	select * from t1;

where T1 is a public synonym to a table in someone else's schema. Therefore, validity of this view is dependent on the fact that there is no object named T1 in your schema. As a result Oracle creates a non-existent object in your schema that the view is dependent on (take a look at the view user_dependencies). Then, when you create an object called T1 in your schema, this causes the elimination of the 'non-existent' object, which automatically causes the invalidation and recompilation of the view so that it now references your object T1, rather than the public synonyn T1.

SY.
15 июн 06, 18:16    [2776535]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Ok. owner=0 means SYS. type=2 means TABLE. Therefore, object 16974 is remote table rasu.xx_xxx dblinkname_O.WORLD while object 21104 is remote table rasu.xx_xxx dblinkname_D.WORLD. owner=1 means PUBLIC. type=5 means SYNONYM. Therefore, object 16927 is public synonym rasu_xx_xxx, pointing to remote table rasu.xx_xxx dblinkname_O.WORLD. Now object 16973 has non-existent type (10) and is owner by user with user_id=20. So most likely that user created an object which is referencing public synonym rasu_xx_xxx and oracle created this object (16973) for 'negative dependency'. Content of SYN$ you provided requires more info. Who owns synonyms with object_id=9030 and 21102? Also, since you are не системщик и не ДБА try to stay away from querying SYS tables directly, use data dictionary views.

SY.
15 июн 06, 18:43    [2776627]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
SY
Ok. owner=0 means SYS. type=2 means TABLE. Therefore, object 16974 is remote table rasu.xx_xxx dblinkname_O.WORLD while object 21104 is remote table rasu.xx_xxx dblinkname_D.WORLD. owner=1 means PUBLIC. type=5 means SYNONYM. Therefore, object 16927 is public synonym rasu_xx_xxx, pointing to remote table rasu.xx_xxx dblinkname_O.WORLD. Now object 16973 has non-existent type (10) and is owner by user with user_id=20. So most likely that user created an object which is referencing public synonym rasu_xx_xxx and oracle created this object (16973) for 'negative dependency'. Content of SYN$ you provided requires more info. Who owns synonyms with object_id=9030 and 21102? Also, since you are не системщик и не ДБА try to stay away from querying SYS tables directly, use data dictionary views.SY.
Да я бы и рад не лазить в sys.obj$. но... в all_objects/user_objects/dba_objects есть только один объект с моим именем, и у него Object_id=16927.
ДБА сбросил мне снимок sys.obj$ во временную таблицу TMP_OBJ
SELECT * FROM TMP_OBJ
WHERE obj# IN (9030, 21102)   -- У них Owner#=1, Type#5
16 июн 06, 08:48    [2777536]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
извините, забыл баннер:
Oracle8i Enterprise Edition Release 8.1.7.2.0 - Production
PL/SQL Release 8.1.7.2.0 - Production
CORE 8.1.7.0.0 Production
TNS for Solaris: Version 8.1.7.2.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
16 июн 06, 15:09    [2780179]     Ответить | Цитировать Сообщить модератору
 Re: db_link + synonym  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
если кому интересно решение:
DROPнули все PUBLIC SYNONYM, учавствовавшие в неверных dependencies, и создали заново
после этого всё стало на свои места
21 июн 06, 10:02    [2795124]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить