|
|
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Была создана таблица командой Код: plaintext 1. 2. 3. 4. В таблице есть данные и есть внешние ключи ссылающиеся на ее PK. Хотелось бы - создать индекс для PK в специально предназначенном для этого табличном пространстве (index_ts), дать свое имя индексу и констрейнту. Какова последовательность комманд для корректного и безпроблемного осуществления этих преобразований. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:09 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
1. Грохнуть этот констрейнт 2. alter table add constraint ... primary key(..., ...) using index (...). Индекс получит имя констрейнта. Ещё вариант 0 - проверить, никто ли своим foreign key-ем не цепляет PK, который ты будешь убивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:12 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
В таблице есть данные и есть внешние ключи ссылающиеся на ее PK. То есть тогда 1) грохнуть foreign key констрейнты на этот PK 2) грохнуть РК 3) alter table add constraint ... primary key(..., ...) using index (...) 4) создать foreign keys заново ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:23 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Да, верно. Я в спешке не заметил подробностей про FK. Знаешь, как получить список всех ссылающихся FK? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:27 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Если только перенести, без переименования, попробуй это: alter index <имя> rebuild tablespace <имя нужно табличной области> Имя индекса из: select CONSTRAINT_NAME from dba_constraints where owner=UPPER('таблица') and constraint_type = UPPER('P') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:28 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
select * from user_dependencies; Заморочки конечно, а еще во всех книгах советуют делай мол create table dept (id number(10) primary key, ... А нельзя ли просто сказать что то типа alter table ... MODIFY CONSTRAINT ... use index ... чтобы сказать чтобы для PK использовался некий заранее созданный индекс? Можно ли с помощью alter table ... MODIFY CONSTRAINT переименовать констрейнт? PS В доке смотрела там такие диаграммы, в них час надо разбираться.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:33 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
А переименовать можно хакерским способом: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 13:36 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
можно примерно так (в пакете) type tFKConstr is record ( table_name dba_tables.table_name%type, constr_name dba_constraints.constraint_name%type, field_list varchar2(254), pk_fields varchar2(254), pk_table dba_tables.table_name%type, pk_constr dba_constraints.constraint_name%type, enabled boolean := true, cascade boolean := false ); -- таблица по заданной структуре type tFKConstrList is table of tFKConstr index by binary_integer; -- список ограничений FKConstrList tFKConstrList; ... procedure ConstrFK_Off( tn in varchar2, isDelete in boolean default false ) is i integer; begin -- удаляем все записи FKConstrList.delete; -- заполняем массив for curConstr in ( select c1.table_name, c1.constraint_name, c1.delete_rule, c1.status, c1.r_constraint_name from dba_constraints c1, dba_constraints c2 where c2.owner = owner_ and c2.table_name = upper(tn) and c1.constraint_type = 'R' and c1.r_owner = c2.owner and c1.r_constraint_name = c2.constraint_name ) loop i := FKConstrList.count + 1; -- FKConstrList(i).table_name := curConstr.table_name; FKConstrList(i).constr_name := curConstr.constraint_name; FKConstrList(i).field_list := Get_Constr_Fields(curConstr.constraint_name); FKConstrList(i).pk_table := upper(tn); FKConstrList(i).pk_fields := Get_Constr_Fields(curConstr.r_constraint_name); FKConstrList(i).pk_constr := curConstr.r_constraint_name; -- if curConstr.status = 'DISABLED' then FKConstrList(i).enabled := false; end if; -- if curConstr.delete_rule = 'CASCADE' then FKConstrList(i).cascade := true; end if; -- end loop; -- отключаем все работающие ограничения if FKConstrList.count > 0 then for i in 1..FKConstrList.count loop if isDelete then ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '|| 'drop constraint '||FKConstrList(i).constr_name ); else if FKConstrList(i).Enabled then ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '|| 'disable constraint '||FKConstrList(i).constr_name ); end if; end if; end loop; end if; -- end; -- включаем ограничения для пересоздания первичного ключа -- или создаём заново procedure ConstrFK_On( tn in varchar2, isCreate in boolean default false ) is begin -- проверяем наличие записей для включения ограничений if FKConstrList.count > 0 then -- включаем все работавшие ограничения for i in 1..FKConstrList.count loop if FKConstrList(i).pk_table = upper(tn) then if isCreate then ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '|| 'add constraint '||FKConstrList(i).constr_name||' foreign key ('|| FKConstrList(i).field_list||') '||cr|| ' references '||owner_||'.'||FKConstrList(i).pk_table||'('|| FKConstrList(i).pk_fields||') '|| iif(FKConstrList(i).cascade,'on delete cascade ','')|| iif(FKConstrList(i).Enabled,'','disable') ); else if FKConstrList(i).Enabled then ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '|| 'enable constraint '||FKConstrList(i).constr_name ); end if; end if; end if; end loop; end if; -- FKConstrList.delete; -- end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:07 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
прошу прощения, что не сохранил форматирование, могу попробовать повторить с форматированием ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:10 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
to Vladimir Спасибо. Текст я и так смогу сохранить сохранить, может в будущем пригодится. to softbuilder А переименовать можно хакерским способом: В 9.2 можно alter table ... RENAME CONSTRAINT old_name TO new_name; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:18 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
1.Сделайте disable всех форенкиев ссылающихся на этот первичный ключ. 2. Сделайте disable первичного ключа: alter table dept disable primary key; 3. Создайте индекс по тем же полям, что и в первичном ключе CREATE INDEX ИМЯ_ИНДЕКСА ON dept(id) tablespace ИМЯ_ТАБЛЭСПАЙСА; 4. Сделайте alter table dept enable primary key; 5. Произведите активизацию FK выключенных в п.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:21 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
"В 9.2 можно alter table ... RENAME CONSTRAINT old_name TO new_name;" Я пока не перешёл на 9i и не собираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:39 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
to softbuilder В 9.2 можно ... - это я так для информации, вдруг кому понадобится. Я пока не перешёл на 9i и не собираюсь. В этом высказывании усматриваю недовольство 9 кой. Или мне кажется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:45 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:48 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Можно быстро выключить PK и связанные FK так: alter table xxx disable primary key cascade; Затем PK включается с созданием индекса в нужном разделе: alter table xxx enable constraint cccc using index tablespace ttttt; К сожалению, включать FK придется по одному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 14:57 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
"В этом высказывании усматриваю недовольство 9 кой. Или мне кажется?" Ты знаешь, что RDTEX например еще поддерживает клиентов на Oracle 6? Интересно что эти клиенты ответят, если задать твой вопрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 15:23 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
запинают наверное:-) Ладно всем спасибо, закрываем тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 15:41 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Как закрываем? А результы моих исследований? Код: 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. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. Как ты хотела и tablespace и имя. Вот только с foreign key я не проверял. Попробуй сама. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 15:54 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
to softbuilder Я ограничилась вашим советом alter index <имя> rebuild tablespace <имя нужно табличной области> быстро и не надо ничего удалять и пересоздавать. переименовывать что-то в sys.con$ я не решилась:-) Совет Al'а тоже занесла в свой knowledge base. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:06 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
to Violina: Вобщем-то правильно, если в 9i есть специальная команда "alter table ... RENAME CONSTRAINT old_name TO new_name;" то конечно лучше использовать её. А кстати а команда для изменении имени индекса в 9i есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:11 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
2 softbuilder & ALL Не рекомендую обращаться в техсаппорт с вопросом: "я тут сделал update sys.props$ set xxxx where aaaa; после чего база перестала запускаться". Там скажут, что для доступа в словарь существуют команды DDL, а прямой доступ категорически не рекомендуется за исключением рекомендаций самого саппорта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:17 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
Кстати, я упустил один момент. Дело в том что при использовании alter index <имя> rebuild tablespace <имя нужно табличной области> происходит блокировка исходного индекса. Поэтому для уменьшения влияния блокировки нужно использовать опцию online: alter index <имя> rebuild tablespace <имя нужно табличной области> online ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:20 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
to AI: я в курсе. К счастью мы отказалтсь от саппорта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:21 |
|
||
|
Переопределение primary key для таблицы
|
|||
|---|---|---|---|
|
#18+
А почему "к счастью"??? Кстати, rebuild online не во всех случаях можно сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:23 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32164180&tid=1990458]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
161ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 502ms |

| 0 / 0 |
