2014-12-02 114 views
6

我正在將應用程序從Access轉換爲SQL Server 2014.此工具的功能之一是允許用戶創建即席SQL查詢以修改刪除或將數據添加到多個表中。跟蹤誰在C#應用程序或SQL Server中對SQL Server進行更改

現在在Access中沒有跟蹤誰在做什麼,所以如果事故被搞砸了,沒有辦法知道它是誰或是什麼時候發生(它發生的次數足以說明它是一個嚴重的問題以及該工具正在被重寫的許多原因之一)。

我正在編寫的應用程序是C#中的Windows應用程序。我正在尋找任何以及所有關於如何在不對服務器(處理或空間)提出巨大需求的情況下完成的建議。由於用戶正在創建自己的查詢,我不能只爲用戶名和日期添加一列(也只能跟蹤最近的更改)。

我們不需要保留舊數據,甚至不需要確定發生了什麼變化。誰改變了數據,什麼時候改變了數據。我希望能夠查看某些東西(視圖,表格,甚至是單獨的數據庫),這些東西向我顯示了做出更改的用戶列表以及他們執行操作的時間。

+1

在SQL Server中的內置機制,從2008版開始,更改數據捕獲(CDC),它不只是。它也會告訴你什麼改變了。 – 2014-12-03 00:06:21

+0

從迄今爲止我讀過的所有內容來看,CDC沒有捕捉到做出更改的用戶名。我也不需要保留所有的變化。這可能會導致數據庫增長得比我想要的大得多。 – 2014-12-03 16:29:47

+0

你如何處理你的C#應用​​程序中的數據庫訪問? Single userId或Windows身份驗證(意味着每個用戶都有一個數據庫帳戶)? – UnhandledExcepSean 2014-12-03 21:10:32

回答

0

您可以考慮使用觸發器和日誌表,這將適用於所有SQL Server。觸發器與CDC相比要貴一些,但如果用戶已經直接在桌面上更新,這應該不成問題。我想這也取決於你想記錄多少表。

我將爲您提供用於記錄已更改表或幾個表的用戶一個簡單的例子(只需添加觸發器表):

CREATE TABLE UserTableChangeLog 
(
    ChangeID INT PRIMARY KEY IDENTITY(1,1) 
    , TableName VARCHAR(128) NOT NULL 
    , SystemUser VARCHAR(256) NOT NULL DEFAULT SYSTEM_USER 
    , ChangeDate DATETIME NOT NULL DEFAULT GETDATE() 
) 

GO 

CREATE TABLE TestTable 
(
    ID INT IDENTITY(1,1) 
    , Test VARCHAR(255) 
) 

GO 
--This sql can be added for multiple tables, just change the trigger name, and the table name 
CREATE TRIGGER TRG_TABLENAME_Log ON TestTable 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --Can be used to get type of change, and wich data that was altered. 
    --SELECT * FROM INSERTED; 
    --SELECT * FROM DELETED; 

    DECLARE @tableName VARCHAR(255) = (SELECT OBJECT_NAME(parent_id) FROM sys.triggers WHERE object_id = @@PROCID); 

    INSERT INTO UserTableChangeLog (TableName) VALUES (@tableName); 

END 

GO 

這是它是如何工作的:

INSERT INTO TestTable VALUES ('1001'); 
INSERT INTO TestTable VALUES ('2002'); 
INSERT INTO TestTable VALUES ('3003'); 
GO 

UPDATE dbo.TestTable SET Test = '4004' WHERE ID = 2 

GO 

SELECT * FROM UserTableChangeLog 

enter image description here

+0

這可能是我最終不得不做的,但我聽說觸發器可以真正影響性能。 – 2014-12-03 16:28:32

+0

@斑點騎士:它取決於觸發器,如果​​你在觸發器中運行一些「昂貴」的查詢,它會在觸發時顯着影響你的性能,因爲你必須等待它完成。在短時間間隔內可能有數百或數千個不同的UPDATE/INSERT/DELETE查詢的情況下,我也會重新考慮不使用觸發器。在這個例子中,它不會使用比額外的「一行INSERT」更多的性能,女巫甚至很難測量。 – 2014-12-03 20:32:15

0

您還沒有指定的SQL Server版本,反正如果你有一個版本> = 2008 R2可以使用Extended Events來監視你的系統。

Extended Events Config

Extended Events Log

在計算器上,你可以閱讀my answer到類似的問題

+0

我確實說過我要去SQL Server 2014.在這個版本中可用的這些擴展事件是否仍然被刪除? – 2014-12-03 16:25:54

+0

對不起...有可用於所有版本(包含快遞版本) – Max 2014-12-03 16:38:14

相關問題