|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Прочёл эти две древние темы: Получение имени "сработавшего" FK при INSERT'е в ХП http://sql.ru/forum/actualthread.aspx?tid=409862&hl=%ee%ef%f0%e5%e4%e5%eb%e8%f2%fc+%e8%ec%ff+%f2%e0%e1%eb%e8%f6%fb#3928894 Может ли триггер узнать имя или номер таблицы для которой он вызывается? http://sql.ru/forum/actualthread.aspx?tid=60592&hl=%ee%ef%f0%e5%e4%e5%eb%e8%f2%fc+%e8%ec%ff+%f2%e0%e1%eb%e8%f6%fb#430223 Вопрос в следующем. Может спустя столько лет появилась возможность узнать имя таблицы для которой срабатывает триггер? Может это будет в версии 2.х или 3.х? Просто когда ведёшь логи, например, то код для всех таблиц одинаковый, а если таблиц 50-100, то тратиться достаточно много времени на копирование кода для всех таблиц, а если потом нужно этот код коректировать, да ещё и на боевой базе... то опять же уходит достаточно много времени. Было бы вообще здорово, если бы была возможно создать один триггер для всех таблиц, в котором можно было бы определять значения контекстных переменных типа CURRENT_TABLE, CURRENT_TRIGGER, или что-то вроде этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:04 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Разве бывают тригерры сразу на несколько таблиц? По-любому триггер нацеливается лишь на одну. Другое дело, что логику логирования можно не помещать в триггер, а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы. В ХП по этому аргументу можно через обращение к системным таблицам узнать поля, составить текст select'а, исполнять его через execute statement и далее уже логировать как душе удобно. При такой схеме, триггеров будет много, но они будут состоять лишь из вызыва хранимки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:15 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arniРазве бывают тригерры сразу на несколько таблиц? вот я и про тоже, я имел ввиду, что хорошо бы, если бы они были ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:24 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni Другое дело, что логику логирования можно не помещать в триггер, а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы. Ну да, сейчас так и делаю. Просто таблиц многовато. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:25 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11 arniРазве бывают тригерры сразу на несколько таблиц? X> вот я и про тоже, я имел ввиду, что хорошо бы, если бы они былиочередной всплеск гиперактивности мутантов... -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:28 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni Другое дело, что логику логирования можно не помещать в триггер, а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы. В ХП по этому аргументу можно через обращение к системным таблицам узнать поля, составить текст select'а, исполнять его через execute statement и далее уже логировать как душе удобно. При такой схеме, триггеров будет много, но они будут состоять лишь из вызыва хранимки. да, но вызываю хранимку, ей нужно передать имя триггера или имя таблицы, что на данный момент прописывается ручками. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:30 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Мимопроходящий X11 arniРазве бывают тригерры сразу на несколько таблиц? X> вот я и про тоже, я имел ввиду, что хорошо бы, если бы они былиочередной всплеск гиперактивности мутантов... -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.4 мерси за комплимент )))))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:33 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Напиши программу, которая будет вытаскивать список таблиц и для выбранных из списка по шаблону генерировать нужный текст триггера. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:38 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11 по-моему всякие "КОММУНИКАЦИИ", "ДОБАВЛЕНИЕ", "ИЗМЕНЕНИЕ" и "УДАЛЕНИЕ" - слишком жирно для и без того сумашедшим образом распухающих таблиц логгов. Все эти рюшки можно и при просмотре добавить. Приведу кусок из своих закромов: Код: 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. 64. 65. 66. 67. 68. 69. 70. 71.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:47 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
ЛентяйНапиши программу, которая будет вытаскивать список таблиц и для выбранных из списка по шаблону генерировать нужный текст триггера. можно даже SP =) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 14:52 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni, спасибо. Переделаю, как у тебя. А то у меня немного не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:11 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni, я смотрю, что ты не хранишь в логах имя пользователя, какой смысл логов? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:32 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni Код: plaintext
Вот это вот - зачем? Не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:35 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11arni, я смотрю, что ты не хранишь в логах имя пользователя, какой смысл логов? есть такое поле с default user или в тригере через current_user цепляется - сейчас не помню, но вобщем автоматом садится ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:44 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
WildSery arni Код: plaintext
Вот это вот - зачем? Не понял. Лог - это одно поле, куда в текстовом виде складываются все поля. Перевод строки нужен, чтобы при просмотре было удобочитабеельнее. Например: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:50 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Лог глазами прямо из таблицы читаешь? Я вот для этого отдельные процедуры/формы сделал. Зря старался? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 15:58 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni по-моему всякие "КОММУНИКАЦИИ", "ДОБАВЛЕНИЕ", "ИЗМЕНЕНИЕ" и "УДАЛЕНИЕ" - слишком жирно для и без того сумашедшим образом распухающих таблиц логгов. Все эти рюшки можно и при просмотре добавить. ага, особенно с полем, размер которого 10К. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:13 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arni CREATE OR ALTER trigger SP_COLOR_LOG_U0 for SP_COLOR active before update position 1 AS begin --логгируем изменение строки (фиксация старого состояния) execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '<'); end CREATE OR ALTER trigger SP_COLOR_LOG_U1 for SP_COLOR active after update position 1 AS begin --логгируем изменение строки (фиксация нового состояния) execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '>'); Не понятно, что даёт фиксация старого и нового состояния, тем более что значение ID, как правило не меняется. т.е. в таблице будет две записи: > ID = 12 < ID = 12 что из этого можно понять? или в лог записываются старые и новые значения, так ля понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:22 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11Не понятно, что даёт фиксация старого и нового состояния, тем более что значение ID, как правило не меняется. т.е. в таблице будет две записи: > ID = 12 < ID = 12 что из этого можно понять? или в лог записываются старые и новые значения, так ля понял? Нет. Там у него идет вызов ХР, которая в свою очередь селектит нужные поля по указанному ID и записывает их в таблицу-лог (ну и таймштамп, думаю, добавляет). "Ошибка" у arni в другом - нет смысла использовать два триггера, когда можно обойтись одним (и фактически даже одним вызовом ХР). Единственное "но" - это если у него сложная логика и цепочка триггеров - тогда ставить before-триггер первым в цепочке, after-триггер - последним в цепочке. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:42 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11Не понятно, что даёт фиксация старого и нового состояния, тем более что значение ID, как правило не меняется. т.е. в таблице будет две записи: > ID = 12 < ID = 12 что из этого можно понять? или в лог записываются старые и новые значения, так ля понял? Разве плохо наблюдать в двух соседних строках состояние строки ДО и ПОСЛЕ правки? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:48 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам "Ошибка" у arni в другом - нет смысла использовать два триггера, когда можно обойтись одним (и фактически даже одним вызовом ХР). Единственное "но" - это если у него сложная логика и цепочка триггеров - тогда ставить before-триггер первым в цепочке, after-триггер - последним в цепочке. Если бы логирование происходило в триггере, то действительно подтавляя сначала old.* значения, а потом new.* значения можно сохранить состояние и до и после. Перенося же логику в XП мы теряем все зацепки new.* и old.*. Остается только сканировать текущее значение. Поэтому вызов идет из двух триггеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:52 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
arniЕсли бы логирование происходило в триггере, то действительно подтавляя сначала old.* значения, а потом new.* значения можно сохранить состояние и до и после. Перенося же логику в XП мы теряем все зацепки new.* и old.*. Остается только сканировать текущее значение. Поэтому вызов идет из двух триггеров. Отмазка не принята. Ничто (ну, кроме вышеназванных проблем с цепочками триггеров) не мешает в одном триггере вызывать ХР два раза (один раз с OLD, другой раз с New). В принципе, можно даже в ХР добавить еще один параметр, чтобы передавать old и new одновременно, но это уже спорно - лучше / хуже. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 16:56 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамОтмазка не принята. Ничто (ну, кроме вышеназванных проблем с цепочками триггеров) не мешает в одном триггере вызывать ХР два раза (один раз с OLD, другой раз с New). В принципе, можно даже в ХР добавить еще один параметр, чтобы передавать old и new одновременно, но это уже спорно - лучше / хуже Рустам, подумай: в хранимку я не передаю никаких реальных данных, только ID изменяемой строки. Сама хранимка уже выбирает данные из рабочих таблиц по этому ID. Она ничего не знает про new.* и old.*. Она может только прочитать ТЕКУЩЕЕ значение. Текущим значением в фазе BEFORE за пределами самого триггера будет еще не измененная строка. Текущим значением в фазе AFTER за пределами самого триггера будет уже измененная строка. Т.о. перенося логиrу логирования за пределы триггера (в ХП) мы вынуждены дергать её дважды в двух тригерах на два состояния. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 17:04 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
Странно на строку Код: plaintext
Invalid argument in EXECUTE STATEMENT - cannot convert to string. At procedure 'SP_SYS_LOG' line: 34, col: 3. влияет ли то, что база в кодировке UTF8? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 17:05 |
|
Узнать имя таблицы из триггера
|
|||
---|---|---|---|
#18+
X11Странно на строку Код: plaintext
Invalid argument in EXECUTE STATEMENT - cannot convert to string. At procedure 'SP_SYS_LOG' line: 34, col: 3. глянь, что осаждается в переменной STATM. Может там переполнение, либо с парностью кавычек напутал или еще чего... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2008, 17:10 |
|
|
start [/forum/topic.php?fid=40&fpage=38&tid=1561295]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
103ms |
get tp. blocked users: |
1ms |
others: | 316ms |
total: | 498ms |
0 / 0 |