|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Имеется таблица с адресами примерно такой структуры используемый домен Код: sql 1. 2. 3. 4. 5.
сама табля с флагом прописки (PERMANENT_ADDRESS) и флагом текущего места жительства (CURRENT_ADDRESS) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вздумалось мне корректировать эти флаги в триггере, чтобы не париться с этим в клиенте. В результате родился такой монстр ================= Док. Win7 Ultim x64/Deb 7.6 i386 (Deb 8.3 i386): FB 3.0.0.32483, диалект 3, SS(win)/CS(Deb), Lazarus 1.7; FPC 3.1.1, IBX by -Rik-; IBE 2016.4.29.1 IBE 2016.5.14.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 00:42 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Ой.... вот монстр Код: sql 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.
При попытке выполнить в Эскперте ( и isql) такой скрипт Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
После третьего коммита получаю Код: sql 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.
В принципе, возможно реализовать такой функционал или мне надо пересматривать структуру таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 01:13 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
зы. с одним вообще, никаких проблем ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 01:14 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
AFTER триггер не будет правильнее ? Возможно придётся ещё и записи с NEW.ID исключить из запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 01:53 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
hvlad, че-та лыжи не едут Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Хотел уточнить: до коммита вставленная запись уже подпадает в контекст OLD или еще нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 09:55 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, объясните, как в таблице данные хранятся? Неправильно в триггере апдейтить ту же таблицу. Сервер позволяет, но в чём смысл? Для вставляемой записи вообще нет нотификации old, только new. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:12 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXI, Код, приведенный в первых двух постах сабжа таки работает в BI триггере. Осталось корректно реализовать задачу при апдейте данных (занимаюсь ). Табля содержит список адресов (бывших и нынешних) для субъектов TBL_PEOPLE. В контексте приложения иногда надо указывать (например, в титульном листе амб. карты) адрес прописки и проживания отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:18 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Доквозможно реализовать такой функционал или мне надо пересматривать структуру таблицы? Оно, конечно, возможно, но лично я бы пересмотрел структуру таблиц: текущий адрес человека хранил прямо в таблице людей, а в историю его переездов уже сбрасывал бы этот адрес триггером при изменении. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:20 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
ДокВ контексте приложения иногда надо указывать (например, в титульном листе амб. карты) адрес прописки и проживания отдельно. А в каком документе нужна история перемещения человека? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:23 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Докче-та лыжи не едутОтсюда этого не видно. Рекурсии нет больше ? Требуемая логика до сих пор остаётся загадкой... ДокХотел уточнить: до коммита вставленная запись уже подпадает в контекст OLD или еще нет?Коммит тут вообще не при чём. В операции INSERT нет и быть не может ничего "старого" (OLD) - только новое (NEW). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:24 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovлично я бы пересмотрел структуру таблиц наверное, так будет логичнее и правильнее Dimitry SibiryakovА в каком документе нужна история перемещения человека? ХЗ, Дим, я просто пытаюсь реализовать то,что видел в быту и на работе hvladВ операции INSERT нет и быть не может ничего "старого" (OLD) - только новое (NEW) твои слова "AFTER" и "NEW.ID" почему-то были интерпретированы мной, как совет использовать OLD, сильно поколебав мое вроде бы устоявшееся мировоззрение и заставив пристально перечитывать LR в поисках упущенного тайного смысла OLD Короче, ночью или в перерывах между приемами пациентов ничего придумывать нельзя. Щас, приеду на обед, подумаю над всем выше сказанным. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:41 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, я бы сделал бы так (если принципиально обходиться одной таблицей). Оставил бы один признак (0-прописка, 1 - проживание). И добавил бы дату. При печати определял бы адреса с максимальными датами. Вместо даты можно использовать первичный ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:43 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXI, что тормозило бы простейшие выборки на получение людей и их текущего адреса. Денормализация (текущий адрес в главной таблице а история смены адресов в подчинённой) в данном случае благо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:48 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
ДокDimitry SibiryakovА в каком документе нужна история перемещения человека? ХЗ, Дим, я просто пытаюсь реализовать то,что видел в быту и на работе Как человек, уже прошедший по этим граблям, советую: не пытайся сделать БД всего-всего. Храни только минимально необходимую информацию. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 10:51 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
ДокToo many concurrent executions of the same request. рекурсия? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 11:26 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Симонов Денис, Я привёл как вариант. Конечно, правильно для человека текущую информацию хранить в одной таблице, а историю в другой, меняется не только адрес, но и паспорт, фамилия и т.д. Может у Док'а так и есть, а приведённая таблица только для примера. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 11:35 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
kdvрекурсия? да, оставил код только в BI, не ругается Dimitry SibiryakovКак человек, уже прошедший по этим граблям "Никогда не знаешь, что придет в голову этим пчелам" © У нас в России участково-территориальный принцип приема пациентов, там к адресам могут привязываться списанные бесплатные препараты и проч.проч. Поэтому, может не так уж плохо хранить историю места жительства. Но твой вариант мне тоже нравится. В данном конкретном случае мне, как Таблоиду, уже интересен принципиальный момент: получится ли. Помучаюсь немного ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 16:01 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Кажется, проблема решена. Владу отдельное спасибо за пинок в нужную сторону :) Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 17:23 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, Интересно, а может пользователь снять флаги сам? Если может, то что происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 17:42 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXI, чтоб совсем не было прописки и постоянного места жительства? Может. Хоть из клиента, хоть прямой правкой базы. Он не может выставить для конкретного человека две прописки и/или два постоянных места жительства. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2016, 17:48 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, для меня странно, база адресов есть, а адреса прописки и адреса постоянного проживания нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2016, 11:10 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Я бы сделал такой тригер немного переформатировав if-ы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Вроде не так монстроидально выглядит. Проверки на то, есть что апдейтить или нет - не нужны, при апдейте все равно проверка отработает и если нечего апдейтить - ничего и не проапдейтит. Конечно для избежания холостых апдейтов можно еще и так: (NEW.PERMANENT_ADDRESS is distinct from OLD.PERMANENT_ADDRESS) or (NEW.CURRENT_ADDRESS is distinct from OLD.CURRENT_ADDRESS), но тогда надо разделять insert и update тригеры, а это лениво :) И да, рекурсия в афтер тригере у тебя скорее из-за того что ты не проверяешь ID <> NEW.ID. И ситуаций когда есть человек, у которого был адрес, а теперь нет, можно придумать много - умер, скрылся в неизвестном направлении, отсудили квартиру, был прописан с родителями - выписался... А история адресов с датами может пригодится в самых разных ситуациях. И последнее, я бы не делал такой тригер вообще, а переложил бы эту функцию на приложение (именно с такой структурой таблиц как у тебя). Если бы у тебя был не FB, а например Oracle, ты получил бы ошибку table is mutating и опять страдал бы головной болью. В каком-нибудь MSSQL или Sybase был бы какой-то свой головняк. Уж лучше в приложение :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2016, 14:29 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Andrey_Уж лучше в приложение :) А потом какой-нибудь дурак вручную поправит базу, а приложение или сильно задумается при выборке, или возьмет первую, формально подходящую, запись. И будут вопли, что все работает неправильно :) За код спасибо. У меня на первый взгляд примерно то же, но "своими словами". Потом гляну повнимательнее. Сейчас к "командировке" в Челнах ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 10:24 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXIДок, для меня странно, база адресов есть, а адреса прописки и адреса постоянного проживания нет. Значит, ты просто невнимательно читал топик. У каждого адреса есть фк на хозяина, флаг прописки и флаг фактического проживания, каждый из которых уникален для конкретного фк ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 10:28 |
|
|
start [/forum/topic.php?fid=40&msg=39296891&tid=1561989]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 164ms |
0 / 0 |