powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание PK в таблице с данными
25 сообщений из 32, страница 1 из 2
Создание PK в таблице с данными
    #39708202
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть таблица с данными. В ней составной первичный ключ. Хочу добавить новое поле с простым идентификатором вместо составного. Для этого:
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
Создание PK в таблице с данными
    #39708236
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да. И даже многопоточки нет.
...
Рейтинг: 0 / 0
Создание PK в таблице с данными
    #39708733
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание PK в таблице с данными
    #39708736
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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

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

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


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