|
|
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
Есть таблица Код: sql 1. В таблицу поступает только команда INSERT. Не могу написать триггер, который бы проверял перед вставкой, есть ли такие значения уже в таблице. Если есть, то удалял бы их, а новые вставлял. Например, если уже есть такой pid, или pnum, или и то и другое, то удалить такие строчки, новую вставить в любом случае. И после этих действий выполнял бы вакуум таблицы. Я сам мало этими командами занимался, опыта совсем нет по ним. Спасибо за внимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2015, 21:55 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
PCContra, У вас обе колонки UNIQUE, все уже и так будет как вы хотите, без триггеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2015, 21:57 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
PCContra, в http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-SUMMARY-EXAMPLE блок <<insert_update>> делает то, что вам нужно где то битым словом была нужная вам ф-я. наверное в старой доке. не тригерный вариант --тут http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE переделайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2015, 22:48 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#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. Ошибка SQL: ОШИБКА: отсутствует выражение (примерное положение: ";") LINE 12: RETURN; Почему ругается не return? И еще: я правда не понимаю, зачем там второй begin end (я его оставил из мануала). И третье: может это можно как переписать по-короче и по-производительне е? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2015, 15:24 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
RTFMTriggers that are specified to fire INSTEAD OF the trigger event must be marked FOR EACH ROW, and can only be defined on views . PCContraЕсть таблица Код: sql 1. В таблицу поступает только команда INSERT. Не могу написать триггер, который бы проверял перед вставкой, есть ли такие значения уже в таблице. Если есть, то удалял бы их, а новые вставлял. Например, если уже есть такой pid, или pnum, или и то и другое, то удалить такие строчки, новую вставить в любом случае. И после этих действий выполнял бы вакуум таблицы. Я сам мало этими командами занимался, опыта совсем нет по ним. Спасибо за внимание извините, сразу не вчитался. у вас 2 потенциальных ключа. а не ключевой набор с ресурсами. т.е. если pid уже есть, но с другим pnum, надо заапдейтить pnum при это pid-е. а если есть pnum с другим pid -- надо заапдейтить тот pnum (поменять ему pid). и, наконец если есть 2 записи -- одна с таким pnum а ДРУАЯ с таким pid -- надо выбросить ОБЕ старые ,и заложить новую . так, кажется следует из вашей постановки ? ничего не путаете ? тогда всё немного сложнее . Проще всего с помощью каскада безусловного DELETE | RETURN NEW; в BEFORE триггере. но вот с конкуренцией на инсертах (за оба ключа) надо побороться -- устроить на них очередь в момент входа в триггер -- т.е. еще даже перед DELETE. (чтобы delete опоздуна срабатывал только после коммита опередившей транзакции). Это наверное удобнее сделать через pg_advisory_xact_lock(key1 int, key2 int) вам надо залочить одним предложением 2 инта на разных ключах. т.е .взять в selecte 2 pg_advisory_xact_lock(2) с параметрами например oid pg_attribute-а -- первый параметр; и собственно значение этого поля -- второй. Поля у вас удачно -- интовые. были бы бигинты --пришлось бы что- то иное придумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2015, 16:57 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
qwwqт.е. если pid уже есть, но с другим pnum, надо заапдейтить pnum при это pid-е. а если есть pnum с другим pid -- надо заапдейтить тот pnum (поменять ему pid). и, наконец если есть 2 записи -- одна с таким pnum а ДРУАЯ с таким pid -- надо выбросить ОБЕ старые ,и заложить новую . так, кажется следует из вашей постановки ? ничего не путаете ? Да, все именно так. pid у меня - это результат от pg_backend_pid(), два одинаковых pid'а в один момент времени быть не может. pnum - пользователь, два параллельных запроса от одного пользователя, наверное, тоже быть не могут. :-) Старые строчки можно удалить, если хотя бы одно из значений совпадает. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. RTFMTriggers that are specified to fire INSTEAD OF the trigger event must be marked FOR EACH ROW, and can only be defined on views. Я это прочитал как: Триггер, указанный как "вместо" должен быть для каждой строки для представлений (а для не представлений может быть указан как FOR STATEMENT). Ошибся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2015, 19:47 |
|
||
|
Помогите написать триггер
|
|||
|---|---|---|---|
|
#18+
qwwq , спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2015, 22:04 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39015797&tid=1997862]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 494ms |

| 0 / 0 |
