|
|
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть задача создать полноценный версионный справочник. То есть есть поля с кодами объектов и датами начала действия и конца действия. При добавлении, обновлении и удалении ничего удаляется и не модифицируется, а только добавляется и обновляется дата диапазонов действия. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. С триггером на добавление все понятно, он генерирует код объекта, если его нет (реальное создание) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А вот что написать в upd и del - не знаю. Я пытаюсь модифицировать строки old и new, но сервер их все равно удаляет. Может, есть какие хитрые опции создания триггера? По сути, нужен триггер, которые меняет команды upd и del на (ins,upd) и (upd) соответсвенно. В MS SQL такая примочка была, а в PG не нашел :( Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:09:32 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Естественно, вариант INSTEAD OF возможен, но он для вьюхи, а ее не хочется делать, так как это явный костыль будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:13:33 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakamaЯ пытаюсь модифицировать строки old и new, но сервер их все равно удаляет. Может, есть какие хитрые опции создания триггера?А почему Вы документацию не читает на СУБД которую программируете? Там же всё написано: http://www.postgresql.org/docs/9.3/static/plpgsql-trigger.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:35:01 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakama, авторRow-level triggers fired BEFORE can return null to signal the trigger manager to skip the rest of the operation for this row (i.e., subsequent triggers are not fired, and the INSERT/UPDATE/DELETE does not occur for this row). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:37:45 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Ёш, Читал я это. Но толку? Допустим, для update. Присваиваю я old = null, а дату ,которую я исправил в ней, куда девать? Или нужно править не в old, а в самой таблице? Аналогично, с del? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:44:42 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
И потом, допустим, что для upd разобрались. А добавление - вручную прописывать Insert? Просто у меня таблиц много, хотелось бы автоматизировать это хозяйство с точки зрения написания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:49:45 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakama, Код: plsql 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. Получилось что-то типа такого. Но 1) Нужно в 2 х местах явно указывать колонки в upd, что бы не было рекурсии. А это плохо 2) Быстродействие такой схемы весьма сомнительно. Может быть, есть другие какие способы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 20:02:08 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Чем не устраивает иметь две таблицы: активные данные и историю изменений? Example 40-4. A PL/pgSQL Trigger Procedure For Auditing Это многие проходили. Не так уж часто нужна история изменений, чаще работают с текущими версиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 21:20:22 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakamaЕстественно, вариант INSTEAD OF возможен, но он для вьюхи, а ее не хочется делать, так как это явный костыль будет Костылей не увидел. Триггера instead of для этой задачи идеально подходят. При этом пользователи должны работать только с view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 09:22:05 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakama... Просто у меня таблиц много, хотелось бы автоматизировать это хозяйство с точки зрения написания Для автоматизации можно написать скрипт, которому на вход подается имя таблицы/view, а на выходе получается текст функций/триггеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 09:24:18 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakamaПолучилось что-то типа такого. Но 1) Нужно в 2 х местах явно указывать колонки в upd, что бы не было рекурсии. А это плохо 2) Быстродействие такой схемы весьма сомнительно. Может быть, есть другие какие способы? Про быстродействие. Речь же идет о справочнике. Для справочников операции изменения обычно не столь часты, чтобы говорить о проблемах быстродействия. Скорее нужно говорить о скорости выборки (select) из таблицы, в которой полная история изменений ведется. И со временем количество действующих (актуальных) строк будет заметно меньше чем строк с историей изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 09:30:13 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Павел Лузанов, Про редкость изменения согласен. Разбить на несколько таблиц - тоже вариант, его пока не рассматривал. У меня есть еще заковырка - диапазон дат действия для меня не совпадают с часами системы. Ну то есть при добавлении записи я могу насильно указать период действия (например, законого акта), который не совпадает с моменттом создания записи. Тонкость момента связана с тем, что я пытался использовать 2 таких конструкции, получилось плохо Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Функция работает криво. Почему то при связке Код: plsql 1. 2. получается вот что 22;19;"E";"";;"2014-01-25 23:04:19.045";"2014-01-25 23:04:19.045"; 23;19;"F";"";;"2014-01-25 23:04:19.045";"2999-12-31 00:00:00"; То есть даты плывут, они все одинаковые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 23:30:01 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Виноват, конечно, же добавляля не D, а E ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 23:43:39 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Sergei.AgalakovЧем не устраивает иметь две таблицы: активные данные и историю изменений? Example 40-4. A PL/pgSQL Trigger Procedure For Auditing Это многие проходили. Не так уж часто нужна история изменений, чаще работают с текущими версиями. Мешают оставшиеся ссылки в других таблицах на "старые записи") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 04:06:55 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Не настолько. Ссылки обычно в таких случаюх дают не по ключу, а по коду и дате действия записи. По правилу формирования таблицы это сочетание будет уникальным и вполне пригодно вкачестве составного ключа. А быстродействие - расплата за универсальность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 12:25:31 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
Собственно все зависит от того, насколько часто обновляются справочные данные. Если редко, то одной таблицей проще обойтись, а если они обновляются часто, то лучше таблицы разбить на две: актуальные и архивные записи. Иначе в одной таблице скоро на одну полезную запись будет несколько устаревших, которые бизнес логикой игнорируются, но память мсправно кушают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 19:36:35 |
|
||
|
Как создать "замещающий триггер"&
|
|||
|---|---|---|---|
|
#18+
kamakamaПавел Лузанов, Про редкость изменения согласен. Разбить на несколько таблиц - тоже вариант, его пока не рассматривал. У меня есть еще заковырка - диапазон дат действия для меня не совпадают с часами системы. Ну то есть при добавлении записи я могу насильно указать период действия (например, законого акта), который не совпадает с моменттом создания записи. Не мешай в одну кучу, бизнес-даты и даты системные!!! Выбери что-нибудь одно! И только одно!!! В смысле версионность обязательно надо вести в рамках одного типа дат! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:47:49 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38537562&tid=1998879]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
265ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 588ms |

| 0 / 0 |
