Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Полученить скрипт на создание всего, кроме таблиц. / 13 сообщений из 13, страница 1 из 1
21.04.2009, 10:46
    #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
21.04.2009, 10:50
    #35943598
pravednik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полученить скрипт на создание всего, кроме таблиц.
1 -
Код: plaintext
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',TRUE);
...
Рейтинг: 0 / 0
21.04.2009, 11:00
    #35943621
dmidek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полученить скрипт на создание всего, кроме таблиц.
aleksandy2. удалять создание уникального индекса для первичного ключа, т.к. индекс создается автоматически.


Что то подобное было.
Я поступил прагматически, опираясь на семантику имен - фильтровать Ваш запрос,
чтобы имя индекса отличалось от имени констрейнта. Тогда генерируемые
индексы в него не попадут. Хотя это не стопроцентно чистое решение,
возиожно есть и более "чистый" путь.
...
Рейтинг: 0 / 0
21.04.2009, 11:02
    #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
21.04.2009, 11:05
    #35943632
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полученить скрипт на создание всего, кроме таблиц.
За ответ на первый вопрос спасибо. А что делать со вторым? Может можно как-то отключить spool, а потом включить но уже на добавление?
...
Рейтинг: 0 / 0
21.04.2009, 11:10
    #35943643
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полученить скрипт на создание всего, кроме таблиц.
dmidek,

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

Best regards

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

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

Best regards

Maxim

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

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

Best regards

Maxim

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

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

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

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

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

Best regards

Maxim
...
Рейтинг: 0 / 0
21.04.2009, 12:03
    #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
21.04.2009, 12:21
    #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
21.04.2009, 12:49
    #35944024
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полученить скрипт на создание всего, кроме таблиц.
Maxim Demenko,

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


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