Триггеры SQL Server - группировка по транзакциям

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

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

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

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

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

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


person Community    schedule 16.03.2009    source источник


Ответы (3)


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

sys.dm_tran_current_transaction

person Mladen Prajdic    schedule 16.03.2009
comment
Следите за разрешениями с этим, поскольку для этого представления требуется разрешение VIEW SERVER STATE, которого у стандартных пользователей не будет, и, следовательно, это приведет к сбою триггера. - person Chris Chilvers; 12.08.2009
comment
В качестве продолжения у Ремуса есть решение проблемы с разрешениями с помощью подписи кода stackoverflow.com/questions/1265386/ - person Chris Chilvers; 13.08.2009

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

person HLGEM    schedule 16.03.2009
comment
Не ответ, но важный момент, который нужно принять во внимание. Большое спасибо! - person Guillermo Gutiérrez; 22.03.2013

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

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 
person Eric Petroelje    schedule 16.03.2009