2011-10-16 51 views
3

我想在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') 

我想知道所有的交易(插入,更新,刪除)該表,他們的日期時間,以及應用的查詢。

這樣做的最好方法是什麼?

+1

您的查詢並不一定表示上次表進行了更新。您需要使用第三方日誌讀取器工具(和事務日誌)來確定歷史數據。這是一個持續的需求嗎? –

+0

哎馬丁·我想我們應該能夠發現裏面SQL這樣的信息withoud由於SQL提供了每個數據的基礎上 –

+1

日誌文件使用的是第三方,但它不記錄格式。你可以使用'sys.fn_dblog'來玩玩,但第三方工具供應商已經花費了很多工時來做這件事。如果這是一個持續的需求,你還沒有回答? –

回答

0

你會好得多了這方面的需要設置審覈,而不是試圖從事務日誌回顧提取這些信息。

如果你是企業版,你可以使用內置的SQL Server Audit功能,否則它應該是相對簡單的登錄觸發器通過所需的信息。

2

在合理的時間內完成此操作的唯一方法是使用可以讀取事務日誌並獲取所需信息的第三方工具(如Martin在第一條評論中所述),例如ApexSQL Log

注意,爲了這個工作你的數據庫必須是在完全恢復模式,因爲這是當SQL Server日誌完整的交易細節,可以在以後重建。

另一種選擇是研究如何使用無證fn_dblog功能但這需要你更多的時間,你將無法讀取超脫日誌或事務日誌備份。

1

創建一個觸發器,它會創建一個新表Emp_audit並添加新的元組到它時,任何變化表僱員製作

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); 
相關問題