Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание PK в таблице с данными / 25 сообщений из 32, страница 1 из 2
26.09.2018, 10:01
    #39708202
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Добрый день.
Есть таблица с данными. В ней составной первичный ключ. Хочу добавить новое поле с простым идентификатором вместо составного. Для этого:
1. удаляю старый PK
2. добавляю простую колонку ID (без NOT NULL)
3. заполняю значениями ID
4. устанавливаю NOT NULL в ID
5. создаю новый PK на колонке ID

При попытке выполнить пункт 5 ошибка:
[FireDAC][Phys][FB]validation error for column ID, value "*** null ***"

Скрипты выполняются последовательно в рамках одного подключения к БД.
Перед выполнением каждого скрипта "вручную" запускается транзакция.
После выполнения в зависимости от результата commit или rollback.
Версия FB: 3.0.3.32900.
Скрипты выполняются программно в Delphi 10 Seattle + FireDAC.

Что я делаю не так? Вроде в рамках одного подключения должны быть видны предыдущие изменения...
Хотелось бы отметить, что ошибка происходит только если в таблице есть данные.
Между выполнением скриптов (останавливался в точке останова) подключался к базе и проверял наличие NULL в поле ID. NULL отсутствовали. Более того NOT NULL для колонки ID применилось, значит NULL в колонке не может быть по определению.
...
Рейтинг: 0 / 0
26.09.2018, 10:35
    #39708236
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

зачем это делать через FireDac? В IB Expert никак? Или это попытка сделать автообновления БД у пользователей на местах?

Freddie26При попытке выполнить пункт 5 ошибка:
[FireDAC][Phys][FB]validation error for column ID, value "*** null ***"

эта ошибка должна вывалится на 4 пункте
...
Рейтинг: 0 / 0
26.09.2018, 10:43
    #39708245
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

разбавь сценарий реконнектами. На каждом этапе. Жалко тебе, что ли.
...
Рейтинг: 0 / 0
26.09.2018, 10:49
    #39708251
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов Денис,

Да, это попытка сделать автообновления БД у пользователей на местах.

Симонов Денис эта ошибка должна вывалится на 4 пункте
К сожалению на commit именно пункта 5. Транзакция остановлена перед выполнением пункта 5, NOT NULL установлен на колонке ID, т.е. пункт 4 выполнен (это я вижу в IBExpert при срабатывании точки останова после выполнения пункта 4). К слову в IBExpert скрипты выполняются безусловно. Второй день голову ломаю и проверяю варианты...
У меня 4 таких таблицы. На две из них первичный ключ накатывается (данных в них нет), на две - нет (данные есть). Накатывается если создания PK разбиваю на отдельные запросы.
...
Рейтинг: 0 / 0
26.09.2018, 10:52
    #39708253
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Котовасия,

Мне то не жалко, но логика автообновления не предусматривает реконект. Не хотелось бы переписывать без явной необходимости, т.е. если этого требует регламент СУБД.
...
Рейтинг: 0 / 0
26.09.2018, 11:01
    #39708264
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

ну, страдай.
...
Рейтинг: 0 / 0
26.09.2018, 11:07
    #39708273
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Котовасияну, страдай.
Окай :(

А если по существу, хотелось бы на будущее понять как избежать таких ситуаций. Если это баг - задачу на багтрекер Firebird. Если у меня в коде косяк - исправить.
...
Рейтинг: 0 / 0
26.09.2018, 11:09
    #39708277
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

как вариант. На этапе 3 обновление записей порождает мусор, которые не успевает собраться до того момента когда ты создаёшь PK. По идее это возможно, если отключена кооперативная сборка мусора или вообще сборка мусора на уровне коннекта. Потому что по идее установка NOT NULL должна была бы этот мусор собрать (происходит фулскан с проверкой наличия NULL). Хотя странно что оно не ругнулось на этапе установки NOT NULL.
...
Рейтинг: 0 / 0
26.09.2018, 11:10
    #39708278
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Котовасия,

это называется замести мусор под ковёр
...
Рейтинг: 0 / 0
26.09.2018, 11:12
    #39708281
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26К слову в IBExpert скрипты выполняются безусловно. Второй день голову ломаю и проверяю варианты...Ищи активнцю тр-цию, которая не даёт собрать мусор с нуллами
...
Рейтинг: 0 / 0
26.09.2018, 11:13
    #39708282
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26Котовасияну, страдай.
Окай :(

А если по существу, хотелось бы на будущее понять как избежать таких ситуаций. Если это баг - задачу на багтрекер Firebird. Если у меня в коде косяк - исправить.
Я метаданные правлю с реконнектами, бог знает с какой версии FB, ибо ну их нафик потом калеченные бызы у клиента поднимать.
...
Рейтинг: 0 / 0
26.09.2018, 11:15
    #39708290
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов ДенисКотовасия,

это называется замести мусор под ковёр
Это воркэраунд, основанный на шишках. Хорошо, если в новых версиях он лишний, но ведь не мешает же?
...
Рейтинг: 0 / 0
26.09.2018, 11:17
    #39708292
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов ДенисНа этапе 3 обновление записей порождает мусор, которые не успевает собраться до того момента когда ты создаёшь PKИменно так.
Симонов ДенисПо идее это возможно, если отключена кооперативная сборка мусора или вообще сборка мусора на уровне коннекта.При построении индекса мусор собирается принудительно и синхронно (т.е. кооперативно). Помешать может только активная тр-ция, или isc_dpb_no_garbage_collect
Симонов ДенисПотому что по идее установка NOT NULL должна была бы этот мусор собрать (происходит фулскан с проверкой наличия NULL). Хотя странно что оно не ругнулось на этапе установки NOT NULL.А вот тут как раз всё может быть оставлено на фоновую сборку. И проверка - простой селект, который конечно же чихал на бекверсии с нуллами.
...
Рейтинг: 0 / 0
26.09.2018, 11:18
    #39708295
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
hvladИщи активнцю тр-цию, которая не даёт собрать мусор с нуллами
Понял.
...
Рейтинг: 0 / 0
26.09.2018, 11:26
    #39708300
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Котовасия,

я против применения лекарства без понимая причины болезни.
Ну и по хорошему, если БД многопользовательская, то для безопасного обновления нужен gfix -shut single -force
Ну и конечно не должно быть выкрутасов с isc_dpb_no_garbage_collect
...
Рейтинг: 0 / 0
26.09.2018, 11:32
    #39708303
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов Денис,

конечно, да.
...
Рейтинг: 0 / 0
26.09.2018, 11:57
    #39708328
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Мужики, огромное вам спасибо! Исправил проблему. Был датасет, который выполнял select и закрывался. У него не была указана транзакция. Я так понимаю в этом случае создаётся автотранзакция, которая в базе будет висеть до закрытия коннекта или, возможно, разрушения компонента (что в моём случае происходит почти одновременно). Указал в компоненте транзакцию (ReadOnly) и проблема решилась. Если честно, я бы на этот датасет без вашего совета никогда бы не посмотрел.
...
Рейтинг: 0 / 0
26.09.2018, 12:02
    #39708333
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

пожалуйста. Только заодно посмотри и в другие датасеты/транзакции. А то для одной таблицы сейчас работает, в следующий раз скрипт на другую будешь делать такое же может произойти.
...
Рейтинг: 0 / 0
26.09.2018, 12:05
    #39708337
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26Мужики, огромное вам спасибо! Исправил проблему. Был датасет, который выполнял select и закрывался. У него не была указана транзакция. Я так понимаю в этом случае создаётся автотранзакция, которая в базе будет висеть до закрытия коннекта или, возможно, разрушения компонента (что в моём случае происходит почти одновременно). Указал в компоненте транзакцию (ReadOnly) и проблема решилась. Если честно, я бы на этот датасет без вашего совета никогда бы не посмотрел.
А я говорил - "реконнекться".
...
Рейтинг: 0 / 0
26.09.2018, 12:06
    #39708339
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов Денис,

обязательно посмотрю. Но код обновления в DLL вынесен с собственным коннектом. Проверяется наличие других коннектов... Вроде больше ничего не должно мешать.
...
Рейтинг: 0 / 0
26.09.2018, 12:08
    #39708342
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26,

приложение однопользовательское?
...
Рейтинг: 0 / 0
26.09.2018, 13:54
    #39708436
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Симонов Денис,

Да. И даже многопоточки нет.
...
Рейтинг: 0 / 0
26.09.2018, 18:11
    #39708733
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
Freddie26Есть таблица с данными. В ней составной первичный ключ. Хочу добавить новое поле с простым идентификатором вместо составного. Для этого:
1. удаляю старый PK
2. добавляю простую колонку ID (без NOT NULL)
3. заполняю значениями ID
4. устанавливаю NOT NULL в ID
5. создаю новый PK на колонке ID

Вот рабочий алгоритм (с учетом управления транзакциями):
1. START TRANSACTION;
2. удаляю старый PK;
3. COMMIT;
4. START TRANSACTION;
5. добавляю простую колонку ID ( сразу с NOT NULL - не понятно, зачем это дергать);
6. заполняю значениями ID;
7. создаю новый PK на колонке ID;
8. COMMIT.
...
Рейтинг: 0 / 0
26.09.2018, 18:14
    #39708736
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
YuRock,

между пунктами 5 и 6 можно вставить еще раз
5.1. COMMIT;
5.2. START TRANSACTION;

так "надежнее".
...
Рейтинг: 0 / 0
26.09.2018, 18:17
    #39708739
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание PK в таблице с данными
YuRock,

в 3.0 не прокатит
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание PK в таблице с данными / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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