Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Нужно поменять столбцы местами (для чего лучше не спршивайте).
При этом учесть что в таблице могут быть индексы, ссылки на другие таблицы и тригера.
Если сначала создать ДОполнительную таблицу create tmp as select
потом ее переименовать в старую, то все индексы удалятся и связь нарушиться . Подскажите как сделать лучше!
13 ноя 06, 12:39    [3390973]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
mflojd
Member

Откуда:
Сообщений: 68
pailex
Нужно поменять столбцы местами (для чего лучше не спршивайте).


ну очень интересно, зачем?
13 ноя 06, 12:40    [3390986]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Сделал временную таблицу так иди же до конца...
Сделай индексы, перекинь FK со старой на временную, создай FK с временной на теже на который смотрит старая удали (переименуй старую), переименуй новую, удали FK на старую и со старой.
В чем проблема?...
13 ноя 06, 12:56    [3391121]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
mflojd
pailex
Нужно поменять столбцы местами (для чего лучше не спршивайте).


ну очень интересно, зачем?

Тестовое задание на работу...
13 ноя 06, 13:39    [3391535]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Proteus
Сделал временную таблицу так иди же до конца...
Сделай индексы, перекинь FK со старой на временную, создай FK с временной на теже на который смотрит старая удали (переименуй старую), переименуй новую, удали FK на старую и со старой.
В чем проблема?...


Пытаюсь сейчас сделать так:
отключить тригерры таблицы
скопировать данные в темп таблицу
очистить данные в старой таблице
перенести из таблицы темп данные в новую таблицу заменяя порядок столцов
влючить триггера.

И вопрс.. как перенести FK?
13 ноя 06, 13:42    [3391558]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Black Dragon
Member

Откуда: Москва
Сообщений: 383
Самый простой вариант сделать вьюху
с нужным чередованием столбцов, а
затем сделать соответствующий синоним на вьюху.
:-)

Со зверским уважением
13 ноя 06, 13:42    [3391561]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Feech
Member

Откуда:
Сообщений: 443
Может, online redefinition?
Смотреть в сторону пакета dbms_redefinition.
13 ноя 06, 13:43    [3391571]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116242
1.С помощью DBMS_METADATA.GET_DDL получаете CREATE TABLE
своей таблицы.
2. Затем (ручками или программно) меняете название таблицы и очередность
колонок.
3. INSERT INTO tab2 -- "новый порядок"
SELECT col1, col3, col2 FROM tab1
4. Удаляете таблицу tab1
5. Переименовываете таблицу tab2 в tab1.
13 ноя 06, 13:45    [3391591]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Black Dragon
Самый простой вариант сделать вьюху
с нужным чередованием столбцов, а
затем сделать соответствующий синоним на вьюху.
:-)

Со зверским уважением


как мне показалось автору необходимо определенная последовательность столбцов именно физически... иначе вопрос стоял бы по другому.
13 ноя 06, 13:45    [3391592]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
pailex
mflojd
pailex
Нужно поменять столбцы местами (для чего лучше не спршивайте).

ну очень интересно, зачем?

Тестовое задание на работу...

ну так кого на работу принимают? Вас или форум sql.ru? Решайте сами, тем более что задачка несложная...
13 ноя 06, 13:46    [3391599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Black Dragon
Самый простой вариант сделать вьюху
с нужным чередованием столбцов, а
затем сделать соответствующий синоним на вьюху.
:-)

Со зверским уважением

Тригера? ссылки с других таблиц пропабуд..да и с индексами
13 ноя 06, 13:46    [3391602]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
[quot dmidek]1.С помощью DBMS_METADATA.GET_DDL получаете CREATE TABLE
своей таблицы.
2. Затем (ручками или программно) меняете название таблицы и очередность
колонок.
Можно тут поподробнее.
Если удалить старую таблицу (с переименованием текущей) удалятся все индексы
13 ноя 06, 13:49    [3391623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Proteus
Member

Откуда:
Сообщений: 1348
pailex
Black Dragon
Самый простой вариант сделать вьюху
с нужным чередованием столбцов, а
затем сделать соответствующий синоним на вьюху.
:-)

Со зверским уважением

Тригера? ссылки с других таблиц пропабуд..да и с индексами


2pailex: С какой стати это все должно пропадать при таком подходе?
13 ноя 06, 13:50    [3391633]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Black Dragon
Member

Откуда: Москва
Сообщений: 383
pailex

Тригера? ссылки с других таблиц пропабуд..да и с индексами


Ничего никуда не пропадет, все ссылки все индексы и констрейнты c тригерами
все останется (если конечно не используется ссылки в приложении в виде
<имя схемы>.<имя_таблицы>).

А этот способ подходит для быстрого изменения на работающей базе с
минимальным временем допустимого простоя (собственно время простоя только время необходимое для создания соответствующих синонимов и
раздачи грантов ролям).
13 ноя 06, 13:53    [3391654]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Proteus
Member

Откуда:
Сообщений: 1348
pailex
[quot dmidek]1.С помощью DBMS_METADATA.GET_DDL получаете CREATE TABLE
своей таблицы.
2. Затем (ручками или программно) меняете название таблицы и очередность
колонок.
Можно тут поподробнее.
Если удалить старую таблицу (с переименованием текущей) удалятся все индексы

Конечно удалятся...
И не только индексы....
Но когда вы получаете DDL там уже будет кусочек для создания индексов, триггеров и FK как я понимаю.
13 ноя 06, 13:54    [3391659]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Экстремизм, конечно, но...
select * from sys.col$
поле COL#
Его можно проапдейтить, потом сбросить shared pool и все. Полрядок полей поменялся
13 ноя 06, 13:55    [3391670]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Proteus
pailex
Black Dragon
Самый простой вариант сделать вьюху
с нужным чередованием столбцов, а
затем сделать соответствующий синоним на вьюху.
:-)

Со зверским уважением

Тригера? ссылки с других таблиц пропабуд..да и с индексами


2pailex: С какой стати это все должно пропадать при таком подходе?

С вьюхой не прокатит, так как нужно менять саму таблицу
13 ноя 06, 13:56    [3391671]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Black Dragon
Member

Откуда: Москва
Сообщений: 383
dmidek
1.С помощью DBMS_METADATA.GET_DDL получаете CREATE TABLE
своей таблицы.
2. Затем (ручками или программно) меняете название таблицы и очередность
колонок.


А если таблица весит гигов 50-100?
Представляете сколько вы ее перестраивать будете?
Имхо для рабочей базы это не выход.
13 ноя 06, 13:56    [3391676]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Black Dragon
dmidek
1.С помощью DBMS_METADATA.GET_DDL получаете CREATE TABLE
своей таблицы.
2. Затем (ручками или программно) меняете название таблицы и очередность
колонок.


А если таблица весит гигов 50-100?
Представляете сколько вы ее перестраивать будете?
Имхо для рабочей базы это не выход.


А никто и не говорил что пересоздание таблицы с новым порядком колонок это задача для боевой базы.

А вес не самая важная составляющая в критериях принятия решения по такой ситуации на боевой БД. Более важен IMHO время простоя БД.
13 ноя 06, 14:02    [3391718]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
RA\/EN
Экстремизм, конечно, но...
select * from sys.col$
поле COL#
Его можно проапдейтить, потом сбросить shared pool и все. Полрядок полей поменялся

ТАкой вариант врядли кто нибуть запустит на рабочей базе..
Да и какие привелегии нужны чтобы менять эту таблицу?
13 ноя 06, 14:02    [3391723]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Elic
Member

Откуда:
Сообщений: 29990
pailex
Тестовое задание на работу...
Тупое бесполезное задание :)
Частный случай :
create table tmp as select rownum as c1, power(10, rownum) as c2, power(2, rownum) as c3, -rownum as c4
  from dual connect by level < 10;

alter table tmp rename column c2 to c_tmp;
alter table tmp rename column c3 to c2;
alter table tmp rename column c_tmp to c3;

update tmp set c2 = c3, c3 = c2;

select * from tmp;

           C1            C3            C2            C4
------------- ------------- ------------- -------------
            1             2            10            -1
            2             4           100            -2
            3             8          1000            -3
            4            16         10000            -4
            5            32        100000            -5
            6            64       1000000            -6
            7           128      10000000            -7
            8           256     100000000            -8
            9           512    1000000000            -9

9 rows selected.


RA\/EN
Его можно проапдейтить, потом сбросить shared pool и все. Полрядок полей поменялся
Дай бог, если при этом просто не поменяется порядок данных в строке :)
13 ноя 06, 14:03    [3391730]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
Black Dragon
Member

Откуда: Москва
Сообщений: 383
RA\/EN
Экстремизм, конечно, но...
select * from sys.col$
поле COL#
Его можно проапдейтить, потом сбросить shared pool и все. Полрядок полей поменялся


Это не экстремизм а извращение.
За такое убивать сразу надо, уже не
один раз твердилось что руками в системных таблицах и вьюхах
ничего менять нельзя поскольку последствия непредсказуемы.
13 ноя 06, 14:06    [3391758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
Elic
pailex
Тестовое задание на работу...

Частный случай :
create table tmp as select rownum as c1, power(10, rownum) as c2, power(2, rownum) as c3, -rownum as c4
  from dual connect by level < 10;

alter table tmp rename column c2 to c_tmp;
alter table tmp rename column c3 to c2;
alter table tmp rename column c_tmp to c3;

update tmp set c2 = c3, c3 = c2;

select * from tmp;

           C1            C3            C2            C4
------------- ------------- ------------- -------------
            1             2            10            -1
            2             4           100            -2
            3             8          1000            -3
            4            16         10000            -4
            5            32        100000            -5
            6            64       1000000            -6
            7           128      10000000            -7
            8           256     100000000            -8
            9           512    1000000000            -9

9 rows selected.

осталось только предусмотреть "частный" случай, когда колонки разного типа
13 ноя 06, 14:17    [3391835]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Elic
[quot pailex]Тестовое задание на работу...
Тупое бесполезное задание :)
Частный случай :
create table tmp as select rownum as c1, power(10, rownum) as c2, power(2, rownum) as c3, -rownum as c4
  from dual connect by level < 10;

alter table tmp rename column c2 to c_tmp;
alter table tmp rename column c3 to c2;
alter table tmp rename column c_tmp to c3;

update tmp set c2 = c3, c3 = c2;

select * from tmp;

           C1            C3            C2            C4
------------- ------------- ------------- -------------
            1             2            10            -1
            2             4           100            -2
            3             8          1000            -3
            4            16         10000            -4
            5            32        100000            -5
            6            64       1000000            -6
            7           128      10000000            -7
            8           256     100000000            -8
            9           512    1000000000            -9

9 rows selected.

Не прокатывает если типы разные
13 ноя 06, 14:19    [3391855]     Ответить | Цитировать Сообщить модератору
 Re: Помогите поменять столбцы местами!!!  [new]
pailex
Member

Откуда:
Сообщений: 124
Я так и не увидел одного нормального алгоритма.
13 ноя 06, 14:23    [3391895]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Oracle Ответить