|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#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 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, дядька, прости что оффтоплю. Я тебе через блог вопрос задал,полюбопытствуй :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 10:34 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Gallemar, Не увидел. Скинь на почту, будет быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 10:49 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, В топике ничего нет, во-первых. Только первичный ключ. ФК на хозяина предполагается, что логично. Но вот уникальность флагов для конкретного фк - это как? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 11:51 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
ДокAndrey_Уж лучше в приложение :) А потом какой-нибудь дурак вручную поправит базу, а приложение или сильно задумается при выборке, или возьмет первую, формально подходящую, запись. И будут вопли, что все работает неправильно :)Далеко тебя занесло. Перед тем как выдвигать такие гипотезы, нужно ответит минимум на один вопрос (как минимум самому себе как product-owner-у): "система должна быть готова к тому, что в нее полезу снаружи и будут менять данные?" Если нет - в общем случае не важно как будет реализовано обновление адресов, через тригер, бизнес-логику клиента или как-нибудь астрально. Если да - желательно в БД сделать свой АПИ (в виде набора хранимок/тригеров/вьюх контролирующих корректность поступающих данных) и через него работать с БД из своего приложения. А прямой доступ к таблицами забрать полностью (ну или select оставить, так и быть уж). Это нужно чтобы когда сторонние приложения начнут лазить в твою БД своими грязными рученками, они лазили по тому же интерфейсу, что и твое приложение. В результате будет гораздо меньше трудозатрат на поддержку внешнего интерфейса БД. Но это всё весьма сферически. На своей практике вторую модель взаимодействия с БД я встречал только в банках (да и то очень фрагментарно). Все остальные учетные системы с этим не заморачивались и были полностью открыты для сторонних приложений. Максимум - не большой АПИ для интеграций, который не замещает общий доступ к ресурсам, а делает его чуть более удобным. P.S. А еще, в качестве минимальной защиты себя от "дурачка вручную правящего базу" можно сделать логирование. Это формально защитит тебя как разработчика от нападок клиентов, но не защитит клиентов от ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 12:28 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXIДок, В топике ничего нет, во-первых. Только первичный ключ. ФК на хозяина предполагается, что логично. Но вот уникальность флагов для конкретного фк - это как? "Уникальность" флагов для одного фк при помощи триггера и была темой этого топа. Ты о чем вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 13:00 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Док, Я о том, что триггер не обрабатывает ситуацию когда оба флага сняты. И где эта обработка не ясно. Мне просто интересно, как Вы защищаетесь от этого? Как вариант, конечно, пусть все записи без флагов. Но мне и это не понятно - записи есть, а результат получить невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 13:24 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
Andrey_, >> Далеко тебя занесло Я не технарь, но в любом деле есть базовые понятия. Насколько я для себя уяснил, имеющиеся в сервере механизмы контроля изменения данных - это и есть защита от дурака. И реализовать их можно различными способами. И этот контроль почти никак не должен зависеть от логики прикладной программы. Логирование - это способ протоколирования изменений и к "защите от дурака" имеет весьма отдаленное отношение ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 14:09 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
KreatorXXIДок, Я о том, что триггер не обрабатывает ситуацию когда оба флага сняты. И где эта обработка не ясно. Мне просто интересно, как Вы защищаетесь от этого? Как вариант, конечно, пусть все записи без флагов. Но мне и это не понятно - записи есть, а результат получить невозможно. А-а-а. .. Вот ты о чем :) У меня задача практическая. Мне нужна не абстрактная уникальность, а уникальность True флагов поля в пределах одного фк Зы. Засим, думаю тему можно закрыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 14:34 |
|
Нужна помощь в написании триггера
|
|||
---|---|---|---|
#18+
ДокНасколько я для себя уяснил, имеющиеся в сервере механизмы контроля изменения данных - это и есть защита от дурака. И реализовать их можно различными способами. И этот контроль почти никак не должен зависеть от логики прикладной программы. Сферически - да. Практически - а оно надо? Это тот самый вопрос "система должна быть готова к тому, что в нее полезу снаружи и будут менять данные?". В данном случае система - это комплекс из БД и прикладного приложения. Ты таки попробуй ответить себе на этот вопрос. Возможно в результате пропадет много других вопросов... или наоборот - появится :) ДокЛогирование - это способ протоколирования изменений и к "защите от дурака" имеет весьма отдаленное отношение ;)Зависит от того, кого мы хотим защитить и от чего. Если пользователя чтобы он глупости не делал, то да, обычно логи плохо помогают... Пока руководителю пользователя не покажешь красивое окошко в котором написано когда и как товарищь Пупкин поставил эту злощастную галочку. А если хотим защитить себя от поиска несуществующей ошибки, или злонамеренных действий одного из пользователей - вполне работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2016, 15:40 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561989]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 191ms |
0 / 0 |