|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Добрый день. Есть таблица с данными. В ней составной первичный ключ. Хочу добавить новое поле с простым идентификатором вместо составного. Для этого: 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 в колонке не может быть по определению. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 10:01 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, зачем это делать через FireDac? В IB Expert никак? Или это попытка сделать автообновления БД у пользователей на местах? Freddie26При попытке выполнить пункт 5 ошибка: [FireDAC][Phys][FB]validation error for column ID, value "*** null ***" эта ошибка должна вывалится на 4 пункте ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 10:35 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, разбавь сценарий реконнектами. На каждом этапе. Жалко тебе, что ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 10:43 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов Денис, Да, это попытка сделать автообновления БД у пользователей на местах. Симонов Денис эта ошибка должна вывалится на 4 пункте К сожалению на commit именно пункта 5. Транзакция остановлена перед выполнением пункта 5, NOT NULL установлен на колонке ID, т.е. пункт 4 выполнен (это я вижу в IBExpert при срабатывании точки останова после выполнения пункта 4). К слову в IBExpert скрипты выполняются безусловно. Второй день голову ломаю и проверяю варианты... У меня 4 таких таблицы. На две из них первичный ключ накатывается (данных в них нет), на две - нет (данные есть). Накатывается если создания PK разбиваю на отдельные запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 10:49 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Котовасия, Мне то не жалко, но логика автообновления не предусматривает реконект. Не хотелось бы переписывать без явной необходимости, т.е. если этого требует регламент СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 10:52 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, ну, страдай. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:01 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Котовасияну, страдай. Окай :( А если по существу, хотелось бы на будущее понять как избежать таких ситуаций. Если это баг - задачу на багтрекер Firebird. Если у меня в коде косяк - исправить. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:07 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, как вариант. На этапе 3 обновление записей порождает мусор, которые не успевает собраться до того момента когда ты создаёшь PK. По идее это возможно, если отключена кооперативная сборка мусора или вообще сборка мусора на уровне коннекта. Потому что по идее установка NOT NULL должна была бы этот мусор собрать (происходит фулскан с проверкой наличия NULL). Хотя странно что оно не ругнулось на этапе установки NOT NULL. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:09 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Котовасия, это называется замести мусор под ковёр ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:10 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26К слову в IBExpert скрипты выполняются безусловно. Второй день голову ломаю и проверяю варианты...Ищи активнцю тр-цию, которая не даёт собрать мусор с нуллами ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:12 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26Котовасияну, страдай. Окай :( А если по существу, хотелось бы на будущее понять как избежать таких ситуаций. Если это баг - задачу на багтрекер Firebird. Если у меня в коде косяк - исправить. Я метаданные правлю с реконнектами, бог знает с какой версии FB, ибо ну их нафик потом калеченные бызы у клиента поднимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:13 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов ДенисКотовасия, это называется замести мусор под ковёр Это воркэраунд, основанный на шишках. Хорошо, если в новых версиях он лишний, но ведь не мешает же? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:15 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов ДенисНа этапе 3 обновление записей порождает мусор, которые не успевает собраться до того момента когда ты создаёшь PKИменно так. Симонов ДенисПо идее это возможно, если отключена кооперативная сборка мусора или вообще сборка мусора на уровне коннекта.При построении индекса мусор собирается принудительно и синхронно (т.е. кооперативно). Помешать может только активная тр-ция, или isc_dpb_no_garbage_collect Симонов ДенисПотому что по идее установка NOT NULL должна была бы этот мусор собрать (происходит фулскан с проверкой наличия NULL). Хотя странно что оно не ругнулось на этапе установки NOT NULL.А вот тут как раз всё может быть оставлено на фоновую сборку. И проверка - простой селект, который конечно же чихал на бекверсии с нуллами. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:17 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
hvladИщи активнцю тр-цию, которая не даёт собрать мусор с нуллами Понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:18 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Котовасия, я против применения лекарства без понимая причины болезни. Ну и по хорошему, если БД многопользовательская, то для безопасного обновления нужен gfix -shut single -force Ну и конечно не должно быть выкрутасов с isc_dpb_no_garbage_collect ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:26 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов Денис, конечно, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:32 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Мужики, огромное вам спасибо! Исправил проблему. Был датасет, который выполнял select и закрывался. У него не была указана транзакция. Я так понимаю в этом случае создаётся автотранзакция, которая в базе будет висеть до закрытия коннекта или, возможно, разрушения компонента (что в моём случае происходит почти одновременно). Указал в компоненте транзакцию (ReadOnly) и проблема решилась. Если честно, я бы на этот датасет без вашего совета никогда бы не посмотрел. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 11:57 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, пожалуйста. Только заодно посмотри и в другие датасеты/транзакции. А то для одной таблицы сейчас работает, в следующий раз скрипт на другую будешь делать такое же может произойти. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 12:02 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26Мужики, огромное вам спасибо! Исправил проблему. Был датасет, который выполнял select и закрывался. У него не была указана транзакция. Я так понимаю в этом случае создаётся автотранзакция, которая в базе будет висеть до закрытия коннекта или, возможно, разрушения компонента (что в моём случае происходит почти одновременно). Указал в компоненте транзакцию (ReadOnly) и проблема решилась. Если честно, я бы на этот датасет без вашего совета никогда бы не посмотрел. А я говорил - "реконнекться". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 12:05 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов Денис, обязательно посмотрю. Но код обновления в DLL вынесен с собственным коннектом. Проверяется наличие других коннектов... Вроде больше ничего не должно мешать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 12:06 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26, приложение однопользовательское? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 12:08 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов Денис, Да. И даже многопоточки нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 13:54 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 18:11 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
YuRock, между пунктами 5 и 6 можно вставить еще раз 5.1. COMMIT; 5.2. START TRANSACTION; так "надежнее". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 18:14 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
YuRock, в 3.0 не прокатит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 18:17 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
YuRockтак "надежнее". Вообще-то это не "надёжнее", а единственный метод не запороть БД пока новый формат записей генерируется птицей только по коммиту. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2018, 18:35 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
YuRock, StartTransaction и Commit само собой разумеющееся между каждым пунктом. А сразу NOT NULL создать в таблице с данными FB (как заметил Симонов Денис, в версии 3.0) не позволяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 09:08 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Freddie26А сразу NOT NULL создать в таблице с данными FB (как заметил Симонов Денис, в версии 3.0) не позволяет.У меня почему-то позволяет. Указываешь DEFAULT и всё работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 14:40 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов ДенисYuRock, в 3.0 не прокатитПридется дефаулт указать, тогда прокатит. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 14:41 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
YuRock, боишься лишний оператор написать. Можно и так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 15:06 |
|
Создание PK в таблице с данными
|
|||
---|---|---|---|
#18+
Симонов Денис, Так у ТС же вроде не прокатывало так? Или это у Фаердака какой-то косяк? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 15:44 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560969]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
others: | 344ms |
total: | 526ms |
0 / 0 |