powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Полученить скрипт на создание всего, кроме таблиц.
13 сообщений из 13, страница 1 из 1
Полученить скрипт на создание всего, кроме таблиц.
    #35943582
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня интересует можно ли как-нибудь из "эталонной схемы" получить скрипты на создание всех CONSTRAINT-ов, INDEX-ов и пр. Нашел такой способ как,
Код: plaintext
dbms_metadata.get_dependent_ddl()
. Но получаемые скрипты приходится править руками, т.к.
1. между запросами надо вставлять точку с запятой ";";
2. удалять создание уникального индекса для первичного ключа, т.к. индекс создается автоматически.

Скрипты формирую так:
Код: plaintext
1.
2.
3.
4.
5.
select dbms_metadata.get_dependent_ddl('CONSTRAINT', table_name) from user_tables where table_name in (<tableList>)
union all
select dbms_metadata.get_dependent_ddl('REF_CONSTRAINT', table_name) from user_tables where table_name in (<tableList>)
union all
select dbms_metadata.get_dependent_ddl('INDEX', table_name) from user_tables where table_name in (<tableList>)

В общем, вроде бы, все описал. Подскажите кто, что может...
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943598
Фотография pravednik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 -
Код: plaintext
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',TRUE);
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943621
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy2. удалять создание уникального индекса для первичного ключа, т.к. индекс создается автоматически.


Что то подобное было.
Я поступил прагматически, опираясь на семантику имен - фильтровать Ваш запрос,
чтобы имя индекса отличалось от имени констрейнта. Тогда генерируемые
индексы в него не попадут. Хотя это не стопроцентно чистое решение,
возиожно есть и более "чистый" путь.
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943625
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmidekaleksandy2. удалять создание уникального индекса для первичного ключа, т.к. индекс создается автоматически.


Что то подобное было.
Я поступил прагматически, опираясь на семантику имен - фильтровать Ваш запрос,
чтобы имя индекса отличалось от имени констрейнта. Тогда генерируемые
индексы в него не попадут. Хотя это не стопроцентно чистое решение,
возиожно есть и более "чистый" путь.

... вдогонку.
И соответственно для индексов использовать не get_dependent_ddl,
а get_ddl.....from user_indexes where table_name = .... and index_name not in
(select constraint_name from user_constraints ....
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943632
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За ответ на первый вопрос спасибо. А что делать со вторым? Может можно как-то отключить spool, а потом включить но уже на добавление?
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943643
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmidek,

В dba_constraints есть поле index_name (from docs - only showing for unique and primary key constraints).

Best regards

Maxim
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943654
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenkodmidek,

В dba_constraints есть поле index_name (from docs - only showing for unique and primary key constraints).

Best regards

Maxim

Вот, Максим, точно, я чувствовал, что есть что то гораздо чище :-)
И ведь вроде помнил про это поле...
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943673
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmidekMaxim Demenkodmidek,

В dba_constraints есть поле index_name (from docs - only showing for unique and primary key constraints).

Best regards

Maxim

Вот, Максим, точно, я чувствовал, что есть что то гораздо чище :-)
И ведь вроде помнил про это поле...

Хотя....А если сначала положится индекс, а затем на поле ляжет констрейнт,
то констрейнт подхватит старый индекс, новый генерироваться не будет
и имена могут различаться. Так можно например класть
неуникальный индекс на ПК. Так что может быть вариант с проверкой совпадения
имен даст нам дополнительную страховку...

Хотя если у топикстартера такие варианты есть, то от него потребуется
четкая последовательность действий по генерации - а именно для описанного
случая, сначала индекс , потом констрейнт
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943702
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока писал спасиб за первый ответ. Ответили на второй. :)

Всем спасибо.
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943761
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmidek,

если создавать сначала индексы, затем констрейнты, то проверки не нужны (ddl генерируется с using index). Хотя, всеравно возможна некоторая недетерминированность. Предположим, есть 2 индекса кандидата для одного констрейнта - тогда констрейнт будет повешен на тот индекс, который создан раньше ( по крайней мере - такое поведение я наблюдал, хотя может быть и ошибаюсь), в этом случае, если очередность в запуске скриптов будет изменена, то констреинт будет поддерживаться другим индексом, по сравнению с оригинальной схемой.

Best regards

Maxim
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943813
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim DemenkoПредположим, есть 2 индекса кандидата для одного констрейнта
А поподробнее можно? Каким это образом может быть 2 кандидата?
Например, я получаю вот такой скрипт на создание первичного ключа.
Код: plaintext
1.
2.
3.
4.
 ALTER TABLE "TEST"."TABLE" ADD CONSTRAINT "PK_TABLE" PRIMARY KEY ("ID")
  USING INDEX PCTFREE  10  INITRANS  2  MAXTRANS  255  COMPUTE STATISTICS 
  STORAGE(INITIAL  65536  NEXT  1048576  MINEXTENTS  1  MAXEXTENTS  2147483645 
  PCTINCREASE  0  FREELISTS  1  FREELIST GROUPS  1  BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
Как я понимаю, чтобы подхватился уже существующий индекс он должен именоваться PK_TABLE, правильно?
А как может быть 2 одинаково именованных индекса? Когда второй запрос на создание индекса кинет эксепшн.
Код: plaintext
1.
2.
create unique index idx_test on table (name);
create unique index idx_test on table (name);
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35943886
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

Код: plaintext
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
SQL> create table emp
   2   (
   3         empno    number( 4 ) not null,
   4         ename    varchar2( 10 ),
   5         job      varchar2( 9 ),
   6         mgr      number( 4 ),
   7         hiredate date,
   8         sal      number( 7 , 2 ),
   9         comm     number( 7 , 2 ),
  10         deptno   number( 2 )
  11   );

Table created.

SQL> create index emp_u1 on emp(ename,empno);

Index created.

SQL> create index emp_u2 on emp(ename,job);

Index created.

SQL> alter table emp add constraint emp_uq unique(ename) using index;

Table altered.

SQL> select constraint_name,index_name
   2   from user_constraints where constraint_name='EMP_UQ';

CONSTRAINT_NAME                INDEX_NAME
------------------------------ ------------------------------
EMP_UQ                         EMP_U1

SQL> drop table emp;

Table dropped.

SQL> create table emp
   2   (
   3         empno    number( 4 ) not null,
   4         ename    varchar2( 10 ),
   5         job      varchar2( 9 ),
   6         mgr      number( 4 ),
   7         hiredate date,
   8         sal      number( 7 , 2 ),
   9         comm     number( 7 , 2 ),
  10         deptno   number( 2 )
  11   );

Table created.

SQL> create index emp_u2 on emp(ename,job);

Index created.

SQL> create index emp_u1 on emp(ename,empno);

Index created.

SQL> alter table emp add constraint emp_uq unique(ename) using index;

Table altered.

SQL> select constraint_name,index_name
   2   from user_constraints where constraint_name='EMP_UQ';

CONSTRAINT_NAME                INDEX_NAME
------------------------------ ------------------------------
EMP_UQ                         EMP_U2

Best regards

Maxim
...
Рейтинг: 0 / 0
Полученить скрипт на создание всего, кроме таблиц.
    #35944024
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Demenko,

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


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