Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Внутри ТФ на апдейт таблички формирую строки InsertRow и InsertedRow для динамического запроса , скажем InsertRow := ''name,...mydate'' , InsertedRow := ''OLD.name,...,NOW()'' соответственно. Триггера(правила) на INSERT нема. ... InsertCmd := ''INSERT INTO '' || quote_ident(TG_TABLE_NAME) || '' ('' || InsertRow || '') VALUES ('' || InsertedRow || ''); ''; EXECUTE InsertCmd ; ... В результате внесения измения возникает ошибка внутри ТФ, типа : ERROR: OLD used in query that is not a rule. КОНТЕКСТ SQL statement ''INSERT INTO my_table (name,...,mydate) VALUES (OLD.name,...,NOW()); '' Теперь вопрос: Как с ентим забороца? С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2007, 20:49 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
а поиск уже не в моде? http://sql.ru/forum/actualsearch.aspx?search=used+in+query+that+is+not+a+rule&sin=0&a=&ma=0&bid=7&dt=-1&s=1&so=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2007, 10:26 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
предложено в примере и вставить строку в ТФ: ... SELECT OLD.* Into temporary old_temp; ... То в моём форточном ПГ 8.2.3 имею: ERROR: syntax error at "temporary" SQL state: 42601 Detail: Expected record variable, row variable, or list of scalar variables following INTO. Context: compile of PL/pgSQL function "proc_historical_update" near line 19 Не останавливаюсь... Пробую так: SELECT * INTO TEMPORARY old_temp FROM OLD; Имею на выходе тоже: ERROR: syntax error at "TEMPORARY" SQL state: 42601 Detail: Expected record variable, row variable, or list of scalar variables following INTO. Context: compile of PL/pgSQL function "proc_historical_update" near line 20 Тогда тупо, для проверки... пишу в отдельном окне: SELECT * INTO TEMPORARY temp_country FROM t_town; select * from temp_country; И как не странно всё работает!!!.. Типа, ура! Обрадованно вставляю данный селект в ТФ... Результат ясен?... Таже ошибка!!! ((( Вопчем нуна помосчь... Иначе придёца для каждой таблицы писать триггер на историю ((( шо не есть гут. С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2007, 21:59 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Крупский То в моём форточном ПГ 8.2.3 имею: +1 Не форточный, но 8.2.3. В 8.1.х работало, в 8.2.х перестало. В чем проблема, пока не разобрался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 05:56 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan Крупский То в моём форточном ПГ 8.2.3 имею: +1 Не форточный, но 8.2.3. В 8.1.х работало, в 8.2.х перестало. В чем проблема, пока не разобрался.скорее всего с 8.2 отпала возможность вставки ROW в таблицу (INSERT ROW.* INTO table). Возможно - из-за отключения т.н. "опущенного FROM" в поведении 8.2. "по умолчанию". Т.ч. видимо и этот (последний) финт ушами уже не работает. Т.ч. выход, видимо, - пользовать другие языки (окромя plpgsql), как и утверждает большинство предложений в поиске. ps 8.2 пока не мучал. т.ч. все - скорее на уровне предположения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 16:47 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
по идёт тока plpgsql :(... Какой язык посоветуете для форточек, и как его подключить.. Просто, как и многие здесь присутсвующие, нахожусь в лимите времени для выбора. Надеюсь на коллективный опыт. Заранее багодарен за ответ. С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 14:46 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
КрупскийВнутри ТФ на апдейт таблички формирую строки InsertRow и InsertedRow для динамического запроса , скажем InsertRow := ''name,...mydate'' , InsertedRow := ''OLD.name,...,NOW()'' соответственно. Триггера(правила) на INSERT нема.Не очень понял, что вы хотите, при изменении таблицы делать в триггере вставку в эту же таблицу ? Это легко сделать на plperl. Обсуждалось не давно, ищите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 16:10 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
мона вести аль в отдельной "исторической таблице"(или в лог-файле) аль записывать в саму себя(ессно создавая дополнительные колонки)... Я выбрал второй вариант - это первое, ответ на вопрос "ЗАЧЕМ?". Второе и главное... Вы советуете использовать plperl но меня в большей степени интетесует ГДЕ его найти(скачать) и как его подключить к форточному ПГ 8.2.+??? Ведь в поставке идёт тока plpsql... С уважением ЗЫ если уже был Явный ответ на мой вопрос... решение на плперл... Я бы был признателен на пряму ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 16:21 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Крупскийпо идёт тока plpgsql 1. перечитав ваш пост про непроходимость TEMPORARY смекнул, что проблема может быть именно в этом слове, (т.е. если действительно в 8.2. пропала возможность строить темповые таблы в контексте ХП, без использования Execute) Попробуйте вместо SELECT INTO выполнить Код: plaintext 2. хотя кажется в вашем случае все могло бы быть несколько проще - если а. вы действительно знаете (вычисляете) список архивируемых полей OLD, и б. все нужные поля кастятся в text (имеется адекватный способ откастить как туда так и обратно), то измените контекст на что-то вроде : Код: plaintext 3. если же вы имеете однотипные (для простоты) пк (а луше - одноименные для всех таблиц - чтобы не вычислять поля пк в триггере) - то можно обойтись несколько иначе. Вместо перечисления VALUES вставьте 'INSERT INTO ... SELECT * FROM ... WHERE пк ='|| OLD.пк ||';' (если архив в той же таблице - на BEFORE INSERT повесте триггерное беспощадное наваривание пк - тогда вставка пк всегда будет по счетчику, что бы вы не пытались в пк впихнуть). В итоге вы сможете "архивировать" даже поля, не поддающиеся легкому преобразованию в текст и обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 17:05 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
"общего триггера" ессно: 1. я написал его для конкретной таблицы и всё прокатило... :) "ОЛД" работает как положено... 2. Триггер общий.. посему если в таблице вдруг окажеца блоб-поле то COALESCE вроде как не к месту... 3. Над этим пунктом подумаю... Привожу примерный текст триггера, который у меня получился.. может так будет лучше дать совет чё и как может кому поможет 8)... Код: 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. 63. C уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 21:49 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Установка plperl: - скачать ActivePerl, установить его - прописать в путях - стандартно создать язык CREATE LANGUAGE plperl и перебор полей обсуждался здесь триггер обсуждался здесь , я форумы перепутал :) сделать цикл по хешмассиву $_TD->{old} можно примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 09:22 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Крупский"общего триггера" ессно: ОФТОП: безотносительно того, что вы выберете в кач-ве решения, я как то смотрел на задачу ведения лога в той же таблице, что и сами записи. Из некоторых вполне понятных соображений, решил, что ведение признака активности записи в другой таблице, с короткой записью, более рационально для версионника. Т.е. схема такая: 1. запись в "основной" таблице никогда не обновляется. и никогда (пользователем) не удаляется. 2. ведется два "ключевых" поля в основной таблице. Одно - безальтернативный триггерный счетчик. Реальный пк. Второе - дефолтный счетчик - "эффективный п.к." (множественные вхождения). На реальный пк смотрит табличка составленная из реальных пк и активных эффективных ключей. В ней уже оба поля - уникальные индексированные. Отсутствие в ней ключа основной таблицы записи означает, что эта версия записи не активна. Отсутствие же в ней записи с "эффективным ключом" - что запись "удалена". Все внешние связи из других таблиц осуществляются на поле-эффективный ключ таблицы ключей. (реально таблица подменяется вью из связи этих 2-х таблиц). Понятно, что экономя на записях версий, мы теряем в скорости на джойнах. Но я использовал такую схему для ведения массовой, многократно повторяющейся выгрузки данных из внешнего приложения. Когда промеж выгрузок записи могут меняться во внешнем приложении. (в триггере на вставку проверялось совпадение записей, в случае которого запись отменялась, в случае различия - вставлялась, а запись в таблице ключей обновлялась). Выгрузку делал поначалу на триггерах. Правда не заметил существенной разницы со случаем ведения всех полей в одной таблице (но уже с выгрузкой непосредственно процедурами), но, честно признаюсь, и особо не мерял. ЗЫ. а насчет универсальности триггера - имхо не стоит выделки. лучше написать автомат, генерящий требуемую вариацию скрипта триггера конкретно под таблицу - быстрее в итоге будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 10:52 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
"исторического триггера"... всё ап чём Вы пишете ессно всё пральна, но я остановился на том варианте, что привёл выше... По ходу смысл тот же в использовании ОЛД/НЬЮ как в варианте дополнительной "исторической таблицей", так и в записи историю прям в текущую таблицу... Что там, что там.. при использовании ОЛД/НЬЮ для формирования строки под EXECUTE, возникнет таже проблема... Я не понимаю почему убрали возможность в ТФ юзать временные таблички... И почему документация не соответствует реалиям!!! :( Что касаемо плперл я попробую установить, хотя это уже усложняет систему в целом... и буду надеяца, что хункция spi_exec_query лишена недостаткофф и работает с ОЛД/НЬЮ без проблем... С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 11:30 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Попытался поставить ПЛПЕРЛ ... Сходу не удалось.. Пишет, мол, АшЫПка: could not load library "c:/.../PostgreSQL/8.2/lib/plperl.dll": unknown error 126 Сдаёца мне, что какая-то проблема со слэшами...в мастдайке... Кто-ньть ставил доп язык в творении Уильяма Гейтса.. для постгре...?? Поделитесь плз.. Или сцылочкой по установке ;)... С уважением ЗЫ Накатил новую версию 8.2.4 Таже проблема с Execute и OLD (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2007, 21:28 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
Глянул... В plperl.dll требует наличия нужной(зависимой) длл-ки perl58.dll.. Скачал и установил 5.8.ххх ЭктивПерл... в постгресовую lib\ переписал на всякий случай енту длл.... Эффект тотже ( С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 00:17 |
|
||
|
Вопрос по триггеру
|
|||
|---|---|---|---|
|
#18+
assa Крупскийпо идёт тока plpgsql ... 3. если же вы имеете однотипные (для простоты) пк (а луше - одноименные для всех таблиц - чтобы не вычислять поля пк в триггере) - то можно обойтись несколько иначе. Вместо перечисления VALUES вставьте 'INSERT INTO ... SELECT * FROM ... WHERE пк ='|| OLD.пк ||';' (если архив в той же таблице - на BEFORE INSERT повесте триггерное беспощадное наваривание пк - тогда вставка пк всегда будет по счетчику, что бы вы не пытались в пк впихнуть). В итоге вы сможете "архивировать" даже поля, не поддающиеся легкому преобразованию в текст и обратно. Правильное решение, у меня все работает так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 10:48 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34596796&tid=2005317]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 414ms |

| 0 / 0 |
