2014-12-02 82 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

相关问题