Триггеры SQL Server - группировка по транзакциям - PullRequest
2 голосов
/ 16 марта 2009

На работе мы только начали создавать среду аудита для нашей базы данных (т.е. регистрировать, какие данные изменились при их создании или обновлении).

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

Однако я хотел бы сделать одно дополнение: если пользователь запускает обновление, которое обновляет более одной таблицы, я бы хотел, чтобы они были сгруппированы вместе в пакете (то есть для генерации уникального идентификатора партии для каждого набора обновления).

Проблема заключается в получении идентификатора партии из триггера. Каждое обновление будет выполняться внутри транзакции, поэтому мне было интересно, смогу ли я использовать идентификатор транзакции для генерации идентификатора партии. Однако я не могу найти способ доступа к идентификатору транзакции в T-SQL.

У кого-нибудь есть идеи?

P.S. - Мы запускаем SQL Server 2008, если это имеет какое-либо значение

Ответы [ 3 ]

2 голосов
/ 16 марта 2009

вы можете просто использовать выберите * из sys.dm_tran_current_transaction

sys.dm_tran_current_transaction

1 голос
/ 16 марта 2009

Вне вопроса, но есть над чем подумать при разработке решения для аудита. Если вы собираетесь проверять записи, содержащие массовые вставки, убедитесь, что все ваши массовые вставки содержат ключевые слова FIRE_TRIGGERS. Вы также должны убедиться, что сами триггеры правильно обрабатывают вставки нескольких строк (и не, не, не через курсор!).

0 голосов
/ 16 марта 2009

Нашел в сети , чтобы получить идентификатор текущей транзакции (который затем можно использовать для создания идентификатора пакета), но не уверен, сработает ли он:

SELECT TOP 1
@transactionID = req_transactionID
FROM
  master..syslockinfo l
INNER JOIN
  master..sysprocesses p ON l.req_spid = p.spid AND l.rsc_dbid = p.dbid AND p.spid = @@spid
WHERE
 l.rsc_dbid = db_id() AND p.open_tran != 0 AND req_transactionID > 0
 ORDER BY req_transactionID 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...