Как получить все журналы транзакций (вставить обновление удаления) для конкретной таблицы в SQL Server 2008 - PullRequest
3 голосов
/ 16 октября 2011

Я хочу получить все транзакции, примененные к определенной таблице в 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')

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

Каков наилучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 17 сентября 2013

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

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

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

2 голосов
/ 29 января 2014

создание триггера, который создаст новую таблицу 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);
0 голосов
/ 16 октября 2011

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

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

...