2009-03-16 2 views
2

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

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

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

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

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

P.S. - Мы бежим SQL Server 2008, если это делает никакой разницы

ответ

2

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

sys.dm_tran_current_transaction

+0

Спасибо, это блестяще! – 2009-03-16 16:29:57

+1

Следите за разрешениями с этим, так как для этого представления требуется разрешение «ПРОСМОТР СЕРВЕРА», которые стандартные пользователи не будут иметь и, следовательно, приведет к сбою триггера. –

+1

В качестве продолжения, у Remus есть решение проблемы разрешения с использованием подписи кода http://stackoverflow.com/questions/1265386/current-transaction-id-in-an-audit-trigger/1267562#1267562 –

0

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

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 
1

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

+0

Спасибо, это полезно. – 2009-03-17 09:51:11

+0

Не ответ, а решающий момент, который нужно принять во внимание. Большое спасибо! –

Смежные вопросы