powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить список всех синонимов, указывающих на несуществующие объекты
20 сообщений из 20, страница 1 из 1
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600260
NikoTrend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, выручайте) Как получить список ВСЕХ синонимов, которые указывают на несуществующие объекты?
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600273
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NikoTrend,

Код: sql
1.
select * from dba_objects where type='SYNONYM';


сработало?
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600284
NikoTrend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
РустамкаNikoTrend,

Код: sql
1.
select * from dba_objects where type='SYNONYM';


сработало?
Так если я правильно понимаю это просто все объекты с типом синоним? Вопрос-то как раз в том, как получить список, указывающий на несуществующие объекты?
Я не уверен, правильно ли это?:
Код: plsql
1.
select * from dba_objects where type='SYNONYM' and db_link IS NULL;
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600293
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikoTrend,
Код: plsql
1.
2.
3.
select * from dba_synonyms s 
where NOT EXISTS (select null 
                    from dba_objects o ...) 
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600369
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQL,

Не все так просто:

Синоним может быть на обьект в удаленной базе.
Cиноним может указывать на синоним, т.е. пройтись надо по иерархии.

SY.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600440
Вадиман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простой вариант:

цикл по синонимам, внутри цикла dbms_utility.name_resolve:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE
  v_schema VARCHAR2(30);
  v_part1 VARCHAr2(30);
  v_part2 VARCHAR2(30);
  v_dblink VARCHAR2(30);
  v_part1_type VARCHAR2(30);
  v_obj_number NUMBER;
BEGIN
  DBMS_UTILITY.name_resolve('yy1', 2, v_schema, v_part1, v_part2, v_dblink, v_part1_type, v_obj_number);
  DBMS_OUTPUT.put_line('schema     =' || v_schema);
  DBMS_OUTPUT.put_line('part1      =' || v_part1);
  DBMS_OUTPUT.put_line('part2      =' || v_part2);
  DBMS_OUTPUT.put_line('dblink     =' || v_dblink);
  DBMS_OUTPUT.put_line('part1_type =' || v_part1_type);
  DBMS_OUTPUT.put_line('obj_number =' || v_obj_number);
END;



Ловим exception "ORA-06564: object yy1 does not exist", чтобы определить, что синоним мертвый
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38600511
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLNikoTrend,
Код: plsql
1.
2.
3.
select * from dba_synonyms s 
where NOT EXISTS (select null 
                    from dba_objects o ...) 


just query generated by TOAD: дохлые --публичные, --частные синонимы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Select s.synonym_name, s.table_owner, s.table_name
from  sys.DBA_synonyms s
where not exists (Select 'x'
                  from sys.DBA_objects o
                  where o.owner = s.table_owner
                  and   o.object_name = s.table_name)
and db_link is null
-- and s.owner = 'PUBLIC'
-- and s.owner <> 'PUBLIC'
order by 1

...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38601630
NikoTrend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38604855
NikoTrend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, если кому интересно вот красивый вариант:
SELECT owner,object_name
FROM dba_invalid_objects
WHERE object_type = ‘SYNONYM’;
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #38605098
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikoTrendКстати, если кому интересно вот НЕкрасивый вариант:
.......
FROM dba_invalid_objects
WHERE object_type = ‘SYNONYM’;
Когда синоним инвалидируется
Invalid Synonyms After an Upgrade
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Получить список всех синонимов, указывающих на несуществующие объекты
    #39859160
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viewer , спасибо за подсказку со скриптом из TOAD (сообщение от 31.03.2014).
Хотел уточнить про следующую непонятную _обратную_ ситуацию.

Имеем набор скриптов создания демо схемы OE для Oracle 18c (взят с GitHub).
Основной скрипт oe_main.sql вызывает скрипт coe_v3.sql -> coe_xml.sql, который вызывает скрипты xdbConfiguration.sql и xdbUtilities.sql, которые создают 5 пакетов с именами coe_%, создают для этих пакетов одноименные PUBLIC SYNONYMs coe_% и используют вызовы процедур из этих пакетов. В конце скрипт coe_xml.sql _удаляет_ все эти 5 пакетов.

После возврата из этой цепочки вызовов скриптов в основной скрипт oe_main.sql в нем _повторно_ выполняются операторы создания PUBLIC SYNONYMs coe_% - те же самые, что и ранее:
Код: plaintext
1.
CREATE OR REPLACE PUBLIC SYNONYM COE_CONFIGURATION FOR COE_CONFIGURATION;
CREATE OR REPLACE PUBLIC SYNONYM COE_NAMESPACES FOR COE_NAMESPACES;
...
Но при этом пакетов с именами coe_% уже _нет_, т.к. они были удалены после использования.
Тем не менее эти синонимы создаются и имеют статус VALID:
select owner, object_name, object_type, status from dba_objects where object_name like 'COE_%';

Код: plaintext
1.
2.
3.
4.
5.
owner   object_name          object_type  status
PUBLIC	COE_CONFIGURATION    SYNONYM	VALID
PUBLIC	COE_DOM_HELPER	     SYNONYM	VALID
PUBLIC	COE_NAMESPACES	     SYNONYM	VALID
PUBLIC	COE_TOOLS	     SYNONYM	VALID
PUBLIC	COE_UTILITIES	     SYNONYM	VALID

А указанный выше скрипт из TOAD выводит их как указывающие "в никуда":
select s.owner as synonym_owner, s.synonym_name, s.table_owner, s.table_name
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
from DBA_synonyms s
where not exists (select 'x'
                  from DBA_objects o
                  where o.owner = s.table_owner
                  and   o.object_name = s.table_name)
and db_link is null
order by 1, 2;

synonym_owner synonym_name table_owner table_name
PUBLIC	COE_CONFIGURATION	SYS	COE_CONFIGURATION
PUBLIC	COE_DOM_HELPER	        SYS	COE_DOM_HELPER
PUBLIC	COE_NAMESPACES	        SYS	COE_NAMESPACES
PUBLIC	COE_TOOLS	        SYS	COE_TOOLS
PUBLIC	COE_UTILITIES	        SYS	COE_UTILITIES

Вопрос: Как могли быть созданы синонимы со ссылкой на несуществующие пакеты? Почему синонимы имеют статус VALID, если они никуда не ссылаются?
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39859335
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SBremenВопрос: Как могли быть созданы синонимы со ссылкой на несуществующие пакеты? Почему синонимы имеют статус VALID, если они никуда не ссылаются?

Oracle не проверяет существовaние обьекта при создании синонима. Синоним инвалидируется как только обьект изменяется (т.е. выдан DDL на обьект). Так-что создание обьекта инвалидирует синоним если он создан раньше самого обьекта:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SQL> create or replace
  2    synonym synonym_test for no_such_object
  3  /

Synonym created.

SQL> select status from user_objects where object_name = 'SYNONYM_TEST'
  2  /

STATUS
-------
VALID

SQL> create table no_such_object(n number)
  2  /

Table created.

SQL> select status from user_objects where object_name = 'SYNONYM_TEST'
  2  /

STATUS
-------
INVALID

SQL> select * from synonym_test
  2  /

no rows selected

SQL> select status from user_objects where object_name = 'SYNONYM_TEST'
  2  /

STATUS
-------
VALID



SY.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860033
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY , спасибо за разъяснение.
Тогда получается, что повторно выполняющиеся в конце скрипта oe_main.sql операторы создания PUBLIC SYNONYMs coe_% на убитые пакеты - просто лишние, не вызывающие ошибки, но и не имеющие смысла.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860048
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY , еще один вопрос.

Есть ли какая-то настройка в глубинах Oracle, чтобы в сообщении об успешном завершении SQL оператора (хотя бы DDL) выводилось имя объекта?
То есть не "View created", а "View <Имя> created".
Не "Synonym dropped, а "Synonym <Имя> dropped".
Не "Package Body created with compilation errors", а "Package Body <Имя> created with compilation errors".

Понятно, что можно включить настройки SQL Plus:
SET ECHO ON
SET VERIFY ON
и смотреть SQL операторы целиком вместе с сообщениями о результате их исполнения, идущими после операторов.
Но вариант, описанный выше, существенно более компактный для просмотра и достаточно наглядный.

В документации по SQL и SQL Plus ничего похожего не нашел.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860052
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SBremenЕсть ли какая-то настройка в глубинах Oracle, чтобы в сообщении об успешном завершении SQL оператора (хотя бы DDL) выводилось имя объекта?


Нет, но при большом желании можно создать AFTER DDL триггер который через DBMS_OUTPUT выводит

Код: plsql
1.
ora_dict_obj_owner || '.' || ora_dict_obj_name



Правда придется включать SET SERVEROUTPUT ON.

SY.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860267
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY , "большое желание" связано с тем, что SQL Developer выводит сообщения о результатах DDL с указанием имени объекта:
Код: plaintext
1.
2.
3.
4.
5.
create table test_t (m number);
Table TEST_T created.

drop table test_t;
Table TEST_T dropped.

А SQL Plus имена объектов не пишет (странно, почему это не сделано просто по умолчанию):
Код: plaintext
1.
2.
3.
4.
5.
SQL> create table test_t (m number);
Table created.

SQL> drop table test_t;
Table dropped.

Поэтому и появилась мысль, что есть какая-то настройка Oracle (типа SET SERVEROUTPUT ON), которая включает/выключает вывод имени объекта в сообщении.

По Вашей рекомендации я создал триггер уровня БД (от имени SYSTEM):
Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE TRIGGER db_ddl_info_object
AFTER DDL ON DATABASE
BEGIN
  DBMS_OUTPUT.PUT_LINE('DB object name is: ' || ora_dict_obj_owner || '.' || ora_dict_obj_name);
END;
Trigger DB_DDL_INFO_OBJECT compiled (это сообщение в SQL Developer, с именем объекта)

Этот триггер выводит необходимую информацию. Спасибо за подсказку.

Некоторая странность состоит в том, что почему-то вывод триггера по-разному работает в схемах SYSTEM и HR.
В схеме SYSTEM все происходит, как ожидалось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> show user
USER is "SYSTEM"

SQL> set serveroutput on
SQL> create table test (v number);
DB object name is: SYSTEM.TEST                                                  

Table created.

SQL> drop table test;
DB object name is: SYSTEM.TEST                                                  

Table dropped.

А в схеме HR при удалении таблицы выдается ДВА сообщения от триггера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> show user
USER is "HR"

SQL> set serveroutput on
SQL> create table test_t (m number);
DB object name is: HR.TEST_T                                                    

Table created.

SQL> drop table test_t;
DB object name is: HR.TEST_T                                                    
DB object name is: HR.TEST_T                                                    

Table dropped.

Так и должно быть? Или что я делаю не так?
БД Oracle 18c XE, все операции в контейнере БД XEPDB1 (создан по умолчанию при установке Oracle 18c).
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860318
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SBremenТак и должно быть? Или что я делаю не так?


Зависит от того включен ли recyclebin или нет. У тебя включен. У пользователя SYSTEM tablespace по умолчанию SYSTEM. На SYSTEM recyclebin не распрoстраняется. Создай под SYSTEM таблицу в, скажем, tablespace USERS и получишь дважды. Добавь вывод DDL в триггер и все увидишь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE
  TRIGGER db_ddl_info_object
  AFTER DDL
  ON DATABASE
  DECLARE
      V_SQL_STMT_LINE_CNT NUMBER;
      V_SQL_STMT_LINE     ORA_NAME_LIST_T;
  BEGIN
      DBMS_OUTPUT.PUT_LINE('DB object name is: ' || ora_dict_obj_owner || '.' || ora_dict_obj_name);
      V_SQL_STMT_LINE_CNT := ORA_SQL_TXT(V_SQL_STMT_LINE);
      FOR V_I IN 1..V_SQL_STMT_LINE_CNT LOOP
        DBMS_OUTPUT.PUT_LINE(V_SQL_STMT_LINE(V_I));
      END LOOP;
END;
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> create table system.test_t (m number);
DB object name is: SYSTEM.TEST_T
create table system.test_t (m number)

Table created.

SQL> drop table system.test_t;
DB object name is: SYSTEM.TEST_T
drop table system.test_t

Table dropped.

SQL> create table system.test_t (m number) tablespace users;
DB object name is: SYSTEM.TEST_T
create table system.test_t (m number) tablespace users

Table created.

SQL> drop table system.test_t;
DB object name is: SYSTEM.TEST_T
ALTER TABLE "SYSTEM"."TEST_T" RENAME TO "BIN$93ggIh9oQ9GbFPX38O
ZtUw==$0"
DB object name is: SYSTEM.TEST_T
drop table system.test_t

Table dropped.

SQL> 



Можешь добавить проверку DDL на NOT LIKE '%RENAME TO "BIN$%' перед выводом ora_dict_obj_owner || '.' || ora_dict_obj_name.

SY.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860541
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY , так и сделал. Итоговый триггер получился такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE TRIGGER db_ddl_info_object
AFTER DDL ON DATABASE
DECLARE
    V_SQL_STMT_LINE_CNT NUMBER;
    V_SQL_STMT_LINE     ORA_NAME_LIST_T;
    v_stmt              VARCHAR2(2000) := '';
BEGIN
    V_SQL_STMT_LINE_CNT := ORA_SQL_TXT(V_SQL_STMT_LINE);
    FOR i IN 1..V_SQL_STMT_LINE_CNT LOOP
      v_stmt := v_stmt || V_SQL_STMT_LINE(i);
    END LOOP;
-- Additional output of DDL text
--    DBMS_OUTPUT.PUT('DDL executed is: ');
--    DBMS_OUTPUT.PUT_LINE(v_stmt);
-- Suppress duplicated trigger output when DDL is DROP (TABLE or INDEX) and RECYCLEBIN is enabled
    if v_stmt NOT LIKE '%RENAME TO "BIN$%' then
      DBMS_OUTPUT.PUT('DB object name is: ');
      if ora_dict_obj_owner IS NOT NULL then
        DBMS_OUTPUT.PUT(ora_dict_obj_owner || '.');
      end if;
      DBMS_OUTPUT.PUT_LINE(ora_dict_obj_name);
    end if;
END;

Свою функцию выполняет, при создании/удалении объектов в SQL Plus имена объектов показывает...
И тут всплыл подводный камень.

В составе комплекта демо схем Oracle есть скрипты mkunplug.sql и mkplug.sql, которые соответственно выгружают ТП EXAMPLE с демо схемами как переносимое ТП и загружают его в БД. Я чуть раньше уже проверил, что они работают правильно - табличное пространство восстанавливается из бэкапа. А сейчас в ходе очередного эксперимента с объектами ТП снова запустил скрипт импорта mkplug.sql - при активном триггере AFTER DDL ON DATABASE с кодом выше.
И скрипт не смог воссоздать ТП, т.к. рухнул вызов impdp с ошибкой _в этом триггере_ (в скрипте импорт идет от имени SYS).

Получается, что использование такого триггера совсем небезопасно и имеет побочные эффекты.
Или я чего-то не учел?
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860564
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SBremenПолучается, что использование такого триггера совсем небезопасно и имеет побочные эффекты.
Или я чего-то не учел?

Hе учел. Ты почему-то решил что SQL > 2000 байт в природе не бывает. Меняй 2000 нa 32767 алучше на CLOB.

SY.
...
Рейтинг: 0 / 0
Получить список всех синонимов, указывающих на несуществующие объекты
    #39860862
SBremen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эх, Семён Семёныч, точно...
Исправил на CLOB, пересоздал триггер - теперь он не мешает работе impdp.
Отлично!

Но зато наблюдаю другой эффект (поначалу непонятный).
Согласно документации "Oracle 18c Database PL-SQL Language Reference":
"Trigger AFTER DDL fires when most SQL DDL statements are issued. Not fired for ALTER DATABASE,
CREATE CONTROLFILE, CREATE DATABASE, and DDL issued through the PL/SQL subprogram interface".

Однако при исполнении скрипта mkplug.sql импорта ТП EXAMPLE с демо схемами при включенном триггере - вывода сообщений триггера _нет_ при выполнении практически всех SQL: CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE INDEX, ALTER TABLE, CREATE SYNONYM, DROP DIRECTORY, CREATE TYPE...

Не мог сначала понять, почему триггер так избирательно работает - в диалоге SQL Plus на создание / удаление тестовых таблиц триггер выводит сообщение, а при работе скрипта - нет (хотя я добавил set serveroutput on в начало скрипта mkplug.sql, а во всех вызываемых скриптах параметр set serveroutput отсутствует).

Потом дошло. В этом скрипте происходит постоянное _изменение connect_ между всеми 6 демо схемами и схемой SYS. И при каждом коннекте - параметр serveroutput _сбрасывается_ в OFF.
Наверное, сбрасываются и другие параметры SQL Plus (?) - я не проверял.

В общем, вопрос с этим триггером закрыт.
Спасибо за помощь, SY .
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить список всех синонимов, указывающих на несуществующие объекты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]