Как получить все журналы транзакций (вставить обновление, удалить) для определенной таблицы в SQL Server 2008

Я хочу, чтобы все транзакции применялись к определенной таблице в SQL Server 2008.

Я нашел последний раз, когда таблица обновлялась с помощью этого скрипта:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'DBName')
AND OBJECT_ID=OBJECT_ID('tableName')

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

Как лучше всего это сделать?


person hasan lamaa    schedule 16.10.2011    source источник
comment
Ваш запрос не обязательно показывает время последнего обновления таблицы. Вам понадобится сторонний инструмент для чтения журналов (и журналы транзакций), чтобы определить это для исторических данных. Это постоянная потребность?   -  person Martin Smith    schedule 16.10.2011
comment
эй, мартин, я думаю, мы должны быть в состоянии найти такую ​​информацию внутри sql без использования третьей стороны, поскольку sql предоставляет файл журнала для каждой базы данных   -  person hasan lamaa    schedule 16.10.2011
comment
Но он не документирует формат. Вы можете поиграться с sys.fn_dblog, но сторонние поставщики инструментов уже потратили на это много человеко-часов. Вы до сих пор не ответили, если это постоянная необходимость?   -  person Martin Smith    schedule 16.10.2011
comment
У меня есть задача узнать все даты, когда конкретная таблица была обновлена ​​(будь то оператор вставки или обновления), используя только запрос sql без использования третьей стороны   -  person hasan lamaa    schedule 16.10.2011
comment
И вы хотите сделать это, чтобы расследовать что-то, что уже произошло, или ваше приложение нуждается в этой функциональности в работе?   -  person Martin Smith    schedule 16.10.2011
comment
он будет работать, когда это необходимо   -  person hasan lamaa    schedule 16.10.2011


Ответы (3)


Единственный способ сделать это за разумное время — использовать сторонний инструмент (как сказал Мартин в первом комментарии), такой как Журнал ApexSQL, который может читать журнал транзакций и получать необходимую информацию.

Обратите внимание, что для того, чтобы это работало, ваша база данных должна быть в режиме полного восстановления, потому что именно тогда SQL Server регистрирует полные сведения о транзакции, которые можно восстановить позже.

Другой вариант — изучить, как использовать недокументированную функцию fn_dblog, но это займет у вас гораздо больше времени, и вы не сможете читать отдельные журналы или резервные копии журналов транзакций.

person Vali Alexandrescu    schedule 17.09.2013

создание триггера, который создаст новую таблицу Emp_audit и добавит в нее новые кортежи всякий раз, когда в таблицу employee вносятся какие-либо изменения

create trigger my_trigger on Employees

AFTER INSERT, UPDATE, DELETE
AS
DECLARE @What varchar(30);
DECLARE @Who varchar(30);
DECLARE @for int;
DECLARE @At time;
DECLARE @COUNTI int;
DECLARE @COUNTD int;
select @COUNTI = COUNT(*) from inserted;
select @COUNTD = COUNT(*) from deleted;
set @Who = SYSTEM_USER;
set @At = CURRENT_TIMESTAMP;

if( @COUNTD = 0 and @COUNTI = 1)
    begin
    set @What = 'insert';
    select @for = EmployeeID from inserted i;
    end
else 
    begin
    if( @COUNTD = 1 and @COUNTI = 0)
        begin 
        set @What = 'delete';
        select @for = EmployeeID from deleted i;
        end
    else  
        begin
        set @What = 'update';
        select @for = EmployeeID from inserted i;
        end
    end

     INSERT INTO EMP_Audit Values (@What, @Who, @for, @At);
person user3247362    schedule 29.01.2014

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

Если вы используете Enterprise Edition, вы можете использовать встроенный SQL Server Audit, в противном случае было бы относительно просто регистрировать нужную информацию с помощью триггеров.

person Martin Smith    schedule 16.10.2011