Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
|
|||
|---|---|---|---|
|
#18+
Хочу отслеживать изменения производимые пользователем в каждом поле таблице. Для этого создана таблица с полями: имя таблице где изменили, поле которое изменили, старое значение, новое значение, пользовател, дата. Пишу триггер на измение (см ниже). Не хочу перебирать в If update все поля таблицы вручную, поэтому первый раз в жизни пишу курсор, на которые всегда поглядывал косо. Но тут как раз проблем не обнаруживаю, но получаю ошибку во время срабатывания триггера: о том, что инструкция If Update может выполнятся только внутри Create Trigger. Вопрос: как это обойти, уж очень лень перебирать все поля вручную CREATE TRIGGER T_НасПункты_ToLog ON [T_НасПункты] FOR UPDATE AS DECLARE curCOLNAMEofT_NasPunkty CURSOR READ_ONLY FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='T_НасПункты' OPEN curCOLNAMEofT_NasPunkty DECLARE @colname char(10) FETCH NEXT FROM curCOLNAMEofT_NasPunkty INTO @colname WHILE (@@FETCH_STATUS = 0) BEGIN --!!!!!!!!!!!!!!!!!!! Execute ('If Update([' + @colname +']) Insert Into LOGINFO..UPDATEDCARDS Values(...)') --!!!!!!!!!!!!!!!!!!! FETCH NEXT FROM curCOLNAMEofT_NasPunkty INTO @colname END CLOSE curCOLNAMEofT_NasPunkty DEALLOCATE curCOLNAMEofT_NasPunkty ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2001, 14:04 |
|
||
|
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
|
|||
|---|---|---|---|
|
#18+
Функция Update() определяет только то, что поле находится в операторе UPDATE вызвавшем тригер, но значение поля могло и не поменяться (например, как было равно 3, так и осталось), поэтому рекомендую следующий метод: 1. записать таблицы Inserted и Deleted во временные таблицы 2. используя Exec() сравнить значения полей во временных таблицах и записать измененные в лог-таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2001, 14:32 |
|
||
|
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
|
|||
|---|---|---|---|
|
#18+
Можно обойтись без курсора. Надо только чтобы в таблице был уникальное ключевое поле, которое не меняется в процессе обновления, например identity. CREATE TABLE t1 (id int not null identity(1,1), cName varchar(10)) CREATE TRIGGER tU_t1 ON [t1] FOR UPDATE AS BEGIN /* заложим (запишем в лог) изменения в колонке cName */ INSERT INTO tLogTable(LogString) -- Вставка в таблицу логов SELECT 'Изменили значение в колонке cName для записи с кодом '+ CONVERT(varchar(10),i.id)+' со значения '+d.cName+' на значение '+i.cName+' ('+CONVERT(varchar(20),GETDATE())+')' FROM inserted i JOIN deleted d ON (i.id=d.id AND i.cName<>d.cName) END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 05:09 |
|
||
|
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
|
|||
|---|---|---|---|
|
#18+
2 Pandre Спасибо, подсказка дельная, но реализация по сути является более дорогим вариантом Osya 2 Osya Изящное решение проблемы которую я не учел (данные пытались изменить но не изенили), правда всё таки оно не отменяет курсоров. Ведь курсор я как раз использовал, что бы пройтись по всем полям таблицы которые могут быть изменены, у Вас это только cName, а у меня их десятки. Я хотел перебрать их все в If Update и сделать соответствующие вставки в логтаблицу, написав при этом один insert. Но видимо if update, находясь в контексте exec не считается в контексте create trigger в котром он только и может находиться. НО!!! как раз Ваше решение обходиться без этого оператора и его по видимому можно засунуть в exec. Буду пробовать, ещё раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 06:37 |
|
||
|
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
|
|||
|---|---|---|---|
|
#18+
2 vlad таблицы Inserted и Deleted тоже не видны в Exec, поэтому и предложены временные таблицы, а дальше делай с ними что хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 08:15 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3544&tid=1825474]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 310ms |

| 0 / 0 |
