powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема при Create view ... with row movment
7 сообщений из 7, страница 1 из 1
Проблема при Create view ... with row movment
    #35247248
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2 8.2 express-c luw
пробовал и на 9.5

В этом посте тут (ближе к низу) Mark Barinstein предложил разделить большую таблицу на архивную и активную и сделать на эти две таблицы view with row movment

Все было хорошо на простом тестовом примере, но как дело дошло до реальной таблицы вылезлаа проблема:
при попытке выполнить такой скрипт:
Код: plaintext
\n-- зачистка для теста\ndrop view t;\ndrop table T1;\ndrop table T2;\n\n-- первая таблица (активная)\ncreate table t1\n(\n ID DECIMAL( 10 ) not null  GENERATED BY DEFAULT AS IDENTITY (START WITH  1 , INCREMENT BY  1 ),\n name varchar( 300 ),\n dt Date,\n PRIMARY KEY (ID)\n);\n\n-- вторая таблица (архивная)\ncreate table t2\n(\n ID DECIMAL( 10 ) not null  GENERATED BY DEFAULT AS IDENTITY (START WITH  1 , INCREMENT BY  1 ),\n name varchar( 300 ),\n dt Date,\n PRIMARY KEY (ID)\n);\n\n-- view которое должно использоваться как таблица\ncreate view t (ID, name, dt) AS \nSELECT ID, name, dt FROM T1 \nUNION ALL \nSELECT ID, name, dt FROM T2\nWITH ROW MOVEMENT;\n\n\n-- ограничения которые определяют что будет помещено в архив\nALTER TABLE t1 ADD CONSTRAINT ARCH_CHECK_1\n CHECK (DT >= \'2008-01-01\')  ENFORCED  ENABLE QUERY OPTIMIZATION ;\n \nALTER TABLE t2 ADD CONSTRAINT ARCH_CHECK_2\n CHECK (DT < \'2008-01-01\')  ENFORCED  ENABLE QUERY OPTIMIZATION ;\n

Ругается SQL2026 Reason code 3 что означает не могу создать view с WITH ROW MOVEMENT так как не все колонки updatable...

если убрать GENERATED BY DEFAULT (заменить на сиквенс + триггер бефоре инсерт) из обоих таблиц то все пучком, но тогда мне придется переделывать и довольно сильно приложение, чего бы не хотелось.

может что-то где-то можно в DB2 настроить что бы создать view?
если честно, то я не понял почему db2 не дает создать такую view ведь у колонок стоит BY DEFAULT, вот если бы стояло GENERATED ALWAYS то я бы понял....
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35247576
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хоть это и похоже на баг, но мне кажется, что это логически неправильно - использовать generated поля здесь.
По-хорошему, у двух таблиц должет быть единый счетчик для идентификатора.
Иначе легко получить ситуацию, где id в обеих таблицах у некоторых строк одинаковые и вы не переместите строку из одной таблицы в другую.
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35248387
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinХоть это и похоже на баг, но мне кажется, что это логически неправильно - использовать generated поля здесь.
По-хорошему, у двух таблиц должет быть единый счетчик для идентификатора.
Иначе легко получить ситуацию, где id в обеих таблицах у некоторых строк одинаковые и вы не переместите строку из одной таблицы в другую.

при желании я могу одинаковый id вставить и без generated by default
если из выше приведенного скрипта убрать generated by default

Вот это запросто прокатывает
Код: plaintext
1.
2.
 insert into t values( 1 , 't1', '2008-01-01');
 insert into t values( 1 , 't2', '2007-01-01');

и после попытка выполнить update t set dt = '2008-01-01' where dt = '2007-01-01' дает отлуп по первичному ключу t1

я попытался убрать у одной таблицы generated by default а у другой оставил - все равно та же ошибка.

в принципе в моем случае разделения на актив/архив не может быть ситуации с одинаковыми id так как в архив данные напрямую не втавляются.
Может какой способ есть для Create view ... with row movment что бы указать ведущую и подчиненную таблицы?

А можно как то в IBM написать про этоу баго-фичу мож они пофиксят :) ?
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35252734
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey KuznetsovРугается SQL2026 Reason code 3 что означает не могу создать view с WITH ROW MOVEMENT так как не все колонки updatable...Выяснилось, что это фича.
Alexey Kuznetsovесли убрать GENERATED BY DEFAULT (заменить на сиквенс + триггер бефоре инсерт) из обоих таблиц то все пучком, но тогда мне придется переделывать и довольно сильно приложение, чего бы не хотелось.Можете объяснить, почему придется переделывать приложение?
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35255435
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinsteinэто фича.
жаль...

Можете объяснить, почему придется переделывать приложение?
Наше приложение написано на java причем написано не очень изящно :)
И все завязано на получение ID последней вставленной записи через IDENTITY_VAR_LOCAL
причем это поведение прошито в базовом классе... соответственно если я для 3-х таблиц переделаю на тригер + сиквенс мне надо как-то исхитрится получать для этих таблиц ID, т.е. надо будет найти все места в программе и их поправить на другой способ получения ID (например select ID from insert). Вобщем по большому счету проблема не в БД а внашей кривововатой программе :)
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35260550
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путем пристального изучения возможностей jdbc был найден метод у Connection
PreparedStatement prepareStatement(String sql, int columnIndexes[])
И если в этот метод передать индекс (жалко что не имя) колонки которая у нас является ID
то после выполнения insert можно легко получить ее значение используя метод ResultSet getGeneratedKeys() . Теперь не придется много менять в коде, надо только определить индекс колонки и подсовывать его перед выполнением запроса.
...
Рейтинг: 0 / 0
Проблема при Create view ... with row movment
    #35260554
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
upd...

оказалось что недостаточно пристально изучал :)
есть метод PreparedStatement prepareStatement(String sql, String columnNames[])
в который можно имена передавать...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема при Create view ... with row movment
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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