Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪谁在C#应用程序或SQL Server中对SQL Server进行了更改_C#_Sql Server_Audit - Fatal编程技术网

跟踪谁在C#应用程序或SQL Server中对SQL Server进行了更改

跟踪谁在C#应用程序或SQL Server中对SQL Server进行了更改,c#,sql-server,audit,C#,Sql Server,Audit,我正在将应用程序从Access转换为SQL Server 2014。此工具的功能之一是允许用户创建特殊的SQL查询,以修改、删除或向多个表中添加数据 目前在Access中,没有跟踪谁在做什么,因此,如果某件事情在事故中出错,就无法知道它是谁或它发生的时间(它已经发生了足够多的次数,这是一个严重的问题,也是重写该工具的许多原因之一) 我正在编写的应用程序是C#中的Windows应用程序。我正在寻找任何和所有的建议,如何在不给服务器(处理或空间)带来巨大需求的情况下做到这一点。由于用户正在创建他们自

我正在将应用程序从Access转换为SQL Server 2014。此工具的功能之一是允许用户创建特殊的SQL查询,以修改、删除或向多个表中添加数据

目前在Access中,没有跟踪谁在做什么,因此,如果某件事情在事故中出错,就无法知道它是谁或它发生的时间(它已经发生了足够多的次数,这是一个严重的问题,也是重写该工具的许多原因之一)

我正在编写的应用程序是C#中的Windows应用程序。我正在寻找任何和所有的建议,如何在不给服务器(处理或空间)带来巨大需求的情况下做到这一点。由于用户正在创建他们自己的查询,我不能只为用户名和日期添加一列(这也只能跟踪最近的更改)


我们不需要保留旧数据,甚至不需要准确地确定发生了什么变化。只是谁改变了数据,他们什么时候改变了数据。我希望能够查看一些东西(视图、表或甚至是单独的数据库),它们向我显示做出更改的用户列表以及他们何时进行更改

> P>可以考虑使用触发器和日志表,这将在所有SQL服务器上工作。触发器比CDC要贵一点,但是如果您的用户已经在您的表上直接更新了,这应该不是问题。我认为这也将取决于您要记录多少表

我将为您提供一个简单的示例,用于记录更改了一个表或多个表的用户(只需将触发器添加到表中):

这就是它的工作原理:

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

您尚未指定SQL Server版本,如果您的版本>=2008 R2,则可以用于监视系统


在stackoverflow上,您可以看到类似的问题

从2008版开始,SQL Server中有一个内置的机制,即更改数据捕获(CDC),它就是这样做的。它也会告诉你到底发生了什么变化。从我到目前为止读到的所有信息来看,CDC并没有捕获做出改变的用户名。而且我不需要保留所有的更改。这可能会导致数据库比我想要的大得多。你是如何在你的c#应用程序中处理对数据库的访问的?单用户ID或Windows身份验证(意味着每个用户都有一个数据库帐户)?Access数据库没有任何安全设置,因此任何人都可以打开它们,C#应用程序也不必担心。我说过我要使用SQL Server 2014。这些扩展事件在该版本中仍然可用还是已被删除?抱歉。。。Yes在所有版本(包括express edition)中都可用。这可能是我最后不得不做的事情,但我听说触发器确实会影响性能。@Spots Knight:这取决于触发器,如果您在触发器中运行一些“昂贵”的查询,它在触发时会显著影响您的性能,因为您必须等待它完成。在短时间内可能有成百上千个不同的更新/插入/删除查询的场景中,我也会重新考虑不使用触发器。然而,在这个例子中,它不会比额外的“一行插入”使用更多的性能,这甚至很难衡量。
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