powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
6 сообщений из 6, страница 1 из 1
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014380
vlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу отслеживать изменения производимые пользователем в каждом поле таблице. Для этого создана таблица с полями: имя таблице где изменили, поле которое изменили, старое значение, новое значение, пользовател, дата.
Пишу триггер на измение (см ниже). Не хочу перебирать в 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
...
Рейтинг: 0 / 0
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014382
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функция Update() определяет только то, что поле находится в операторе UPDATE вызвавшем тригер, но значение поля могло и не поменяться (например, как было равно 3, так и осталось), поэтому рекомендую следующий метод:
1. записать таблицы Inserted и Deleted во временные таблицы
2. используя Exec() сравнить значения полей во временных таблицах и записать измененные в лог-таблицу
...
Рейтинг: 0 / 0
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014399
Osya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно обойтись без курсора. Надо только чтобы в таблице был уникальное ключевое поле, которое не меняется в процессе обновления, например 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
...
Рейтинг: 0 / 0
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014404
vlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Pandre
Спасибо, подсказка дельная, но реализация по сути является более дорогим вариантом Osya

2 Osya
Изящное решение проблемы которую я не учел (данные пытались изменить но не изенили), правда всё таки оно не отменяет курсоров. Ведь курсор я как раз использовал, что бы пройтись по всем полям таблицы которые могут быть изменены, у Вас это только cName, а у меня их десятки. Я хотел перебрать их все в If Update и сделать соответствующие вставки в логтаблицу, написав при этом один insert. Но видимо if update, находясь в контексте exec не считается в контексте create trigger в котром он только и может находиться. НО!!! как раз Ваше решение обходиться без этого оператора и его по видимому можно засунуть в exec. Буду пробовать, ещё раз спасибо.
...
Рейтинг: 0 / 0
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014427
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 vlad
таблицы Inserted и Deleted тоже не видны в Exec, поэтому и предложены временные таблицы, а дальше делай с ними что хочешь.
...
Рейтинг: 0 / 0
Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
    #32014442
vlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pandre, извини, ты действительно смотрел глубже. Спасибо
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос в контексте задачи отслеживания действий пользователя (тригеры)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]