|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Стандартная ситуация: есть справочная таблица (T1) и много таблиц документов (T2). Надо теперь добавить вторичный ключ в документы. Но перед этим надо заNULLить поле, которое участвует в создании ключа и ссылается на несуществующие данные: Код: sql 1. 2.
Так всё работает отлично. Но т.к. таблиц-документов много, то я пробую сделать это же в блоке: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
В селекте одна таблица (для простоты примера). В итоге получаю ошибку при создании вторичного ключа: "Foreign key reference target does not exist". Если закомментировать создание ключа, прогнать блок, а затем раскомментировать и запустить блок ещё раз, то ключ создаётся! Пробовал уже первый execute выполнять в "autonomous transaction", но результат тот же. Подскажите, как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 08:41 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Выполняй оба ES в автономных тр-циях. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 09:31 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
hvladВыполняй оба ES в автономных тр-циях.Попробовал, ошибка та же: violation of FOREIGN KEY constraint "". violation of FOREIGN KEY constraint "FK_T2_1" on table "T2". Foreign key reference target does not exist. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 10:03 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
micis, покажи как пробовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 10:08 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
micis, да, я поспешил с советом. В одном блоке не получится, т.к. внешняя тр-ция всё ещё видит "неправильные" запписи и FK не может быть построен. Можно в блоке просто сгенерить команды и потом их уже выполнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 10:11 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Симонов Денис, Вот создание тестовых таблиц: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вот сам блок: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Причём update выполняется, запрос Код: sql 1.
ничего не возвращает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 10:16 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
hvlad, Да, я уже склоняюсь к тому, что бы сделать 2 блока (точнее, так точно будет работать, я проверял). Просто мне хотелось использовать один блок, потому что в нём я в начале сохраняю состояние проверок (процедура возвращает 0 или 1), выключаю проверки, делаю эти самые изменения и в конце проверки активирую как было. Может подскажете как можно это всё реализовать по-другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 10:23 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Вот интересно, а выполнятор скриптов в ядре сервера облегчил бы ситуацию? из серии Код: sql 1. 2.
Раз уж разработчики категорически против управления транзакциями в процедурах... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:16 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
afgm, IBEScript такое умеет http://www.ibexpert.net/IBE/INDEX.PHP?n=Doc.ScriptExecutive $IFEXISTS This tests the existence of the specified database object or data and executes the following block of the script if the object or data do exist in the database. Syntax 1. {$IFEXISTS DOMAIN|TABLE|VIEW|TRIGGER|PROCEDURE| EXCEPTION|GENERATOR|UDF|ROLE object_name} 2. {$IFEXISTS select_statement} ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:21 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
afgm, и ещё никакого "выполнятора скриптов" в ядре сервера не существует ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:24 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Симонов Дениси ещё никакого "выполнятора скриптов" в ядре сервера не существует Читаем внимательно "облегчил бы?" Я знаю что его нет. В том то всё и дело, что его нет (вдруг оно много кому надо, просто молчат :) ). Есть стейтменты и парсер в ISQL, например. Но как и ISQL, IBEScript - внешний парсер. Из-за чего разработчикам приходится таскать с собой этот огород, либо писать свой велосипед. Вот мне лично обидно за FB. В MSSQL, например, я могу написать скрипт, который выполнить практический все манипуляции по апгреду базы. Никаких внешних тулзятин для этого не надо. А для FB приходится изобретать. К слову о IBEScript. Не умоляя достоинств автора, в нём в своё время наловили багов. Причём не факт что все легко устранимы, потому как пользовали импорт-экспорт FB <-> Excel. В результате не пошёл как промышленный скриптер. Вот экстрактить базу в систему контроля версий, да ещё и с предварительным настройкам, да ещё некоторый таблички с данными - это да, ничего лучше не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:38 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
micisПросто мне хотелось использовать один блок, потому что в нём я в начале сохраняю состояние проверок (процедура возвращает 0 или 1), выключаю проверки, делаю эти самые изменения и в конце проверки активирую как было. Может подскажете как можно это всё реализовать по-другому?Первый раз в этой теме вижу слово "проверки". Что это такое - не знаю и сам придумывать не буду. Так что пока что ничего подсказать просто не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:39 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
afgm, это обход проблемы с боку, а не её решение. Я то же против выполнения DDL в процедурах и управления транзакциями в них. Хотя бы потому, что это не возможно в компилируемых процедурах даже чисто теоретически. Код: sql 1. 2. 3. 4. 5. 6.
Но я ничего не имею против выполнения DDL и DML операторов в одной транзакции. Хоть это сделать не так просто как "выполнятор скриптов", зато правильней. И не надо сравнивать с MS SQL. У них процедура это как раз больше похоже на набор операторов ибо она интерпретируется. С одной стороны плюс ибо скрипты проще накатывать, с другой - минус никакого контроля зависимостей. Всё легко можно поломать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:50 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Симонов Денис Код: sql 1. 2. 3. 4. 5. 6.
Да тут и времянки ещё можно добавить (не GTT, а времянки-времянки) и много чего ещё. Симонов ДенисНо я ничего не имею против выполнения DDL и DML операторов в одной транзакции. Хоть это сделать не так просто как "выполнятор скриптов", зато правильней. Ну вот человек хотел написать процедуру автоматизации и напоролся. Без внешнего выполнятора как-то не получается. Симонов ДенисИ не надо сравнивать с MS SQL. У них процедура это как раз больше похоже на набор операторов ибо она интерпретируется. С одной стороны плюс ибо скрипты проще накатывать, с другой - минус никакого контроля зависимостей. Всё легко можно поломать. Оффтоп, но раз уж начали. Ну тут есть и плюсы и минусы. Рефакторить базу на FB иной раз ох как "весело". А ловить запоздалые поломки на MSSQL просто "чудо". Вон PG тексты вьюх переписывает при переименовании таблицы :) Я вот не могу сказать в пользу жёского контроля зависимостей. Он кончено помогает не напортачить. Вот прям сразу. Но вот переименовать что-либо... Может ближе к идеалу в Оракле? Я не совсем в теме этой СУБД, но галка валид/невалид пытается угодить обоим подходам? Вообще, как правило, недовольство людей при переходе с одной СУБД на другую вызвано тем, что недовольство зреет вокруг "неудобств", являющихся прямым следствием архитектурных особенностей. Вот знаю я приколы FB. Ну не так просто сделать индексные сканы. Скрипты тоже непонятно как вставить, если вообще возможно и нужно. Длина идентификаторов - легаси и это поломать низя, и т.д. Особенно удивительно и приятно, когда разработчикам таки удаётся сделать то, что казалось почти невозможным. В MSSQL появилась версионность, и работает на удивление не плохо. У FB тоже таких свершений было достаточно. Вот перечитывал письмо Джима с заголовком про распределённый firebird, так я лично не представляю количество усилий для реализации написанного, и есть ли оно в отдалённых планах... Это я к чему. Верю в развитие. Верю в лучшее. А тулза для выполнения скриптов должна быть кроссплатформенной, оттестированной (может даже стандартизированной), и желательно, открытой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 12:30 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Выполнение DDL не подчиняется правилам видимости данных, которые установлены для DML-транзакций (открытие этой тайны - тут ). Например, для уровня READ COMMITTED транзакция "А" должна видеть изменения, зафиксированные транзакцией "Б", если эта "А" перечитывает данные, которые меняла "Б". Допустим, тр-ция "А" стартовала в 10:00 и в этот момент в деталь-таблице еще были записи, не позволяющие установить FK. Далее, в 10:01 стартовала тр-ция "Б" и выполнила: update t_detail d set pid = null where not exists(select * from t_master m where m.id = d.pid); commit; Если затем, в 10:02, тр-ция "А" выполнит alter table t_detail add constraint t_detail_fk foreign key(pid) references t_master(id); - то она получит облом. Несмотря на то, что этот "alter table" будет идти в TIL = READ COMMITTED и данные в таблице уже корректны. Вот пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
Вышеприведенное означает, что и вот это тоже не заработает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 13:50 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Таблоид, FK строит индекс, а индекс видит все версии, актуальные на текущий момент. То же самое будет, если на столбце с дубликатами строить ПК - даже если удалить дубликаты, ПК не построится до тех пор, пока удаленные дубликаты не будут убраны как мусор. Или, если в одной транзакции удалить запись, а в другой попытаться добавить запись с тем же ПК. Еще лучше это иллюстрируется при отключении сборки мусора в коннекте и алгоритме с "переиспользованием" идентификаторов ПК. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 14:02 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
afgmМожет ближе к идеалу в Оракле? Я не совсем в теме этой СУБД, но галка валид/невалид пытается угодить обоим подходам? Галка "инвалид" в Оракуле это архитектурный костыль для нетранзакционного DDL. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 14:12 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
hvladmicisПросто мне хотелось использовать один блок, потому что в нём я в начале сохраняю состояние проверок (процедура возвращает 0 или 1), выключаю проверки, делаю эти самые изменения и в конце проверки активирую как было. Может подскажете как можно это всё реализовать по-другому?Первый раз в этой теме вижу слово "проверки". Что это такое - не знаю и сам придумывать не буду. Так что пока что ничего подсказать просто не могу.Вот реальный текст блока: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 14:30 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Hello, Micis! You wrote on 1 сентября 2015 г. 14:32:58: Micisset PATIENT_ID=NULL where PATIENT_ID not in (select ID from PATIENT) этот кусок нужно выполнять с блокированием таблицы Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 14:33 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
kdvFK строит индекс, а индекс видит все версии, актуальные на текущий момент. Это понятно, но версии эти созданы были в той же самой транзакции, что пытается установить FK. И поэтому откат к прежней версии (нарушающей условие FK) будет означать также отмену оператора 'alter table ... add constraint <FK>'. Тут перестраховка какая-то, КМК... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 15:46 |
|
Проблемы с созданием foreign key и предварительной очисткой данных
|
|||
---|---|---|---|
#18+
Таблоидно версии эти созданы были в той же самой транзакции, что пытается установить FK. update создает к текущей версии новую версию, и по возможности чистит ненужные предыдущие. Создание индекса тоже чистит версии. Однако, у тебя в сценарии есть сессия #2, которая стартовала ДО update, соответственно, старые версии удерживаются для нее, и ты сам же пишешь, что после облома и commit в сессии #2 как раз все начинает работать. Так что - были версии, не давали создать ФК. версии стали мусором - убрались, не мешают создать ФК. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 15:52 |
|
|
start [/forum/topic.php?fid=40&fpage=72&tid=1562651]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 407ms |
0 / 0 |