Страница 1 из 1

Определение модифицирующего интерфейса в триггере на таблицу

Добавлено: 23 ноя 2009, 23:40
Friendlyman
У клиента чудесным образом происходят модификации поля в одной таблице.
Это поле использовалось раньше одним образом, а теперь другим образом. И видимо программисты не везде поправили.
Какой конкретно программный код портит это поле, не понятно.
Изменения происходят на достаточно большом промежутке времени, поэтому споймать эту модификацию в журнале тоже весьма сложно.

Родилась идея написать триггер на изменение этой таблицы, и как только будет изменено это поле, сработает триггер и сделает запись в лог файл, кто, когда и из какого интерфейса сделал модификацию.
Вот проблема только, определить из какого интерфейса происходит модификация таблицы.
1) Возможно ли это в триггере?

2) Может предложите другие варианты, кроме анализа исходников?

Добавлено: 24 ноя 2009, 10:12
edward_K
Если у вас MSSQL или ORACLE то кто вам мешает сделать запрос в них из таблиц J...... Найти время и кто и потом в галактическом журнале событий посмотреть какой фейс был запущен, а в обычном что еще рядом менялось.

Добавлено: 24 ноя 2009, 16:32
Den
В словах Эдварда есть доля правды. Мне как то потребовалось написать уведомления юзверям о правке некоторой важной инфы в базе, изменения которой влечет изменения всякой плановой фигни... дак на MSSQL пришлось повесить скрипт на джоб, оный анализиует по журналу кто когда что наизменял/удалял/вставлял и рассылать это по почтовику с утра.
Думаю по дате и времени ,действительно,как заметили Выше, можно выловить запускаемый фейс в это время

Добавлено: 24 ноя 2009, 16:56
ilshat
Вроде MSSQL, например, позволяет вешать несколько тригеров на одно событие. Да и в общем то можно подрехтовать существующий. Создайте свою таблицу для лога и пишите все что хотите.

Добавлено: 25 ноя 2009, 19:06
Screw
А прикладной триггер можно использовать? Если да, то в таком триггере имя текущего вставленого в десктоп интерфейса можно выщемить из полного имени текущего поля в нем. Имя поля получаем с помощью GetIfcCurrentFieldName, а затем копируем из него текст от начала до первой точки. Например, в строке 'Z_STAFF::RECEPTIONMAIN.BRWPERSONS.TMPPERSONS.FIO' Z_STAFF::RECEPTIONMAIN- это имя искомого интерфейса.

Вот правда со встроенными интерфейсами будет сложнее: контейнер может быть один, а встраиваемые - любыми. Но хотя бы контейнер мы сможет определить точно. Ну и, понятно, этот способ не прокатит, если обновление записи было произведено из метода невизуального vip-интерфейса. Таких перцев никак не выловишь.

Добавлено: 25 ноя 2009, 23:46
Friendlyman
Всем большое спасибо за идеи по реализации задачи!
Если честно, думал что-то похожее на то, что сказал Screw.