Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переопределение primary key для таблицы / 25 сообщений из 26, страница 1 из 2
20.05.2003, 13:09
    #32163927
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Была создана таблица командой

Код: plaintext
1.
2.
3.
4.
create table dept
(id number( 10 ) primary key,
name varchar2( 40 ),
...
);


В таблице есть данные и есть внешние ключи ссылающиеся на ее PK.

Хотелось бы - создать индекс для PK в специально предназначенном для этого табличном пространстве (index_ts), дать свое имя индексу и констрейнту.

Какова последовательность комманд для корректного и безпроблемного осуществления этих преобразований.
...
Рейтинг: 0 / 0
20.05.2003, 13:12
    #32163931
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
1. Грохнуть этот констрейнт
2. alter table add constraint ... primary key(..., ...) using index (...). Индекс получит имя констрейнта.

Ещё вариант 0 - проверить, никто ли своим foreign key-ем не цепляет PK, который ты будешь убивать.
...
Рейтинг: 0 / 0
20.05.2003, 13:23
    #32163952
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
В таблице есть данные и есть внешние ключи ссылающиеся на ее PK.

То есть тогда

1) грохнуть foreign key констрейнты на этот PK
2) грохнуть РК
3) alter table add constraint ... primary key(..., ...) using index (...)
4) создать foreign keys заново
...
Рейтинг: 0 / 0
20.05.2003, 13:27
    #32163959
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Да, верно. Я в спешке не заметил подробностей про FK. Знаешь, как получить список всех ссылающихся FK?
...
Рейтинг: 0 / 0
20.05.2003, 13:28
    #32163961
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Если только перенести, без переименования, попробуй это:
alter index <имя> rebuild tablespace <имя нужно табличной области>

Имя индекса из:
select
CONSTRAINT_NAME
from
dba_constraints
where
owner=UPPER('таблица') and
constraint_type = UPPER('P')
...
Рейтинг: 0 / 0
20.05.2003, 13:33
    #32163970
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
select * from user_dependencies;

Заморочки конечно, а еще во всех книгах советуют делай мол

create table dept
(id number(10) primary key,
...

А нельзя ли просто сказать что то типа

alter table ... MODIFY CONSTRAINT ... use index ...

чтобы сказать чтобы для PK использовался некий заранее созданный индекс?

Можно ли с помощью

alter table ... MODIFY CONSTRAINT

переименовать констрейнт?

PS
В доке смотрела там такие диаграммы, в них час надо разбираться....
...
Рейтинг: 0 / 0
20.05.2003, 13:36
    #32163974
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
А переименовать можно хакерским способом:

Код: plaintext
1.
 update sys.con$ set name='новое имя'  where name = 'имя';
...
Рейтинг: 0 / 0
20.05.2003, 14:07
    #32164023
Vladimir_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
можно примерно так (в пакете)

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;
...
Рейтинг: 0 / 0
20.05.2003, 14:10
    #32164028
Vladimir_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
прошу прощения, что не сохранил форматирование, могу попробовать повторить с форматированием
...
Рейтинг: 0 / 0
20.05.2003, 14:18
    #32164044
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
to Vladimir

Спасибо. Текст я и так смогу сохранить сохранить, может в будущем пригодится.

to softbuilder

А переименовать можно хакерским способом:

В 9.2 можно

alter table ... RENAME CONSTRAINT old_name TO new_name;
...
Рейтинг: 0 / 0
20.05.2003, 14:21
    #32164049
Vladimir Demkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
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
...
Рейтинг: 0 / 0
20.05.2003, 14:39
    #32164079
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
"В 9.2 можно
alter table ... RENAME CONSTRAINT old_name TO new_name;"

Я пока не перешёл на 9i и не собираюсь.
...
Рейтинг: 0 / 0
20.05.2003, 14:45
    #32164085
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
to softbuilder

В 9.2 можно ... - это я так для информации, вдруг кому понадобится.

Я пока не перешёл на 9i и не собираюсь.

В этом высказывании усматриваю недовольство 9 кой. Или мне кажется?
...
Рейтинг: 0 / 0
20.05.2003, 14:48
    #32164088
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
...
Рейтинг: 0 / 0
20.05.2003, 14:57
    #32164099
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Можно быстро выключить PK и связанные FK так:
alter table xxx disable primary key cascade;

Затем PK включается с созданием индекса в нужном разделе:
alter table xxx enable constraint cccc using index tablespace ttttt;

К сожалению, включать FK придется по одному.
...
Рейтинг: 0 / 0
20.05.2003, 15:23
    #32164120
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
"В этом высказывании усматриваю недовольство 9 кой. Или мне кажется?"

Ты знаешь, что RDTEX например еще поддерживает клиентов на Oracle 6?

Интересно что эти клиенты ответят, если задать твой вопрос
...
Рейтинг: 0 / 0
20.05.2003, 15:41
    #32164143
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
запинают наверное:-)

Ладно всем спасибо, закрываем тему.
...
Рейтинг: 0 / 0
20.05.2003, 15:54
    #32164159
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Как закрываем? А результы моих исследований?
Код: 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.
SQL> 
SQL> set echo on;
SQL> set termout on;
SQL> 
SQL> connect test;
Connected.
SQL> 
SQL> alter table emp drop primary key;

Table altered.

SQL> 
SQL> alter table emp add primary key (empno)
   2    using index tablespace indx;

Table altered.

SQL> 
SQL> select
   2    index_name,
   3    tablespace_name
   4   from
   5    user_indexes
   6   where
   7    table_name='EMP' ;

INDEX_NAME                     TABLESPACE_NAME                                                      
 ------------------------------ ------------------------------                                       
 
SYS_C00774                     INDX                                                                 

SQL> 
SQL> select
   2    constraint_name
   3   from
   4    user_constraints
   5   where
   6    table_name='EMP' and
   7    constraint_type = 'P' ;

CONSTRAINT_NAME                                                                                     
 ------------------------------                                                                      
 
SYS_C00774                                                                                          

SQL> 
SQL> 
SQL> col cname new_value v_cname;
SQL> 
SQL> select constraint_name cname from user_constraints where
 table_name='EMP' and constraint_type='P';

CNAME                                                                                               
 ------------------------------                                                                      
 
SYS_C00774                                                                                          

SQL> 
SQL> alter index &&v_cname rebuild tablespace indx2;
old    1 : alter index &&v_cname rebuild tablespace indx2
new    1 : alter index SYS_C00774 rebuild tablespace indx2

Index altered.

SQL> 
SQL> connect / as sysdba;
Connected.
SQL> 
SQL> update sys.con$ set name = 'emp_pk' where name = '&&v_cname';
old    1 : update sys.con$ set name = 'emp_pk' where name = '&&v_cname'
new    1 : update sys.con$ set name = 'emp_pk' where name = 'SYS_C00774'

 1  row updated.

SQL> 
SQL> update sys.obj$ set name = 'emp_pk' where name = '&&v_cname';
old    1 : update sys.obj$ set name = 'emp_pk' where name = '&&v_cname'
new    1 : update sys.obj$ set name = 'emp_pk' where name = 'SYS_C00774'

 1  row updated.

SQL> 
SQL> connect test;
Connected.
SQL> 
SQL> select
   2    index_name,
   3    tablespace_name
   4   from
   5    user_indexes
   6   where
   7    table_name='EMP' ;

INDEX_NAME                     TABLESPACE_NAME                                                      
 ------------------------------ ------------------------------                                       
 
emp_pk                         INDX2                                                                

SQL> 
SQL> select
   2    constraint_name
   3   from
   4    user_constraints
   5   where
   6    table_name='EMP' and
   7    constraint_type = 'P' ;

CONSTRAINT_NAME                                                                                     
 ------------------------------                                                                      
 
emp_pk                                                                                              

SQL> 
SQL> Input truncated to  10  characters
spool off;


Как ты хотела и tablespace и имя.

Вот только с foreign key я не проверял.

Попробуй сама.
...
Рейтинг: 0 / 0
20.05.2003, 16:06
    #32164180
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
to softbuilder

Я ограничилась вашим советом

alter index <имя> rebuild tablespace <имя нужно табличной области>

быстро и не надо ничего удалять и пересоздавать.

переименовывать что-то в sys.con$ я не решилась:-)

Совет Al'а тоже занесла в свой knowledge base.
...
Рейтинг: 0 / 0
20.05.2003, 16:11
    #32164187
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
to Violina:
Вобщем-то правильно, если в 9i есть специальная команда "alter table ... RENAME CONSTRAINT old_name TO new_name;" то конечно лучше использовать её.
А кстати а команда для изменении имени индекса в 9i есть?
...
Рейтинг: 0 / 0
20.05.2003, 16:17
    #32164203
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
2 softbuilder & ALL

Не рекомендую обращаться в техсаппорт с вопросом: "я тут сделал update sys.props$ set xxxx where aaaa; после чего база перестала запускаться". Там скажут, что для доступа в словарь существуют команды DDL, а прямой доступ категорически не рекомендуется за исключением рекомендаций самого саппорта.
...
Рейтинг: 0 / 0
20.05.2003, 16:20
    #32164209
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
Кстати, я упустил один момент. Дело в том что при использовании
alter index <имя> rebuild tablespace <имя нужно табличной области>
происходит блокировка исходного индекса.

Поэтому для уменьшения влияния блокировки нужно использовать опцию online:
alter index <имя> rebuild tablespace <имя нужно табличной области> online
...
Рейтинг: 0 / 0
20.05.2003, 16:21
    #32164213
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
to AI: я в курсе.

К счастью мы отказалтсь от саппорта.
...
Рейтинг: 0 / 0
20.05.2003, 16:23
    #32164217
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
А почему "к счастью"??? Кстати, rebuild online не во всех случаях можно сделать.
...
Рейтинг: 0 / 0
20.05.2003, 16:25
    #32164220
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределение primary key для таблицы
для уменьшения влияния блокировки нужно использовать опцию online

т.е. чтобы можно было делать insert и delete во время пересоздания индекса?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переопределение primary key для таблицы / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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