Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql server 表中的审核字段(CreatedBy、UpdatedBy)。这是个好主意吗?_Sql Server_Sql Server 2008_Entity Framework_Database Design - Fatal编程技术网

Sql server 表中的审核字段(CreatedBy、UpdatedBy)。这是个好主意吗?

Sql server 表中的审核字段(CreatedBy、UpdatedBy)。这是个好主意吗?,sql-server,sql-server-2008,entity-framework,database-design,Sql Server,Sql Server 2008,Entity Framework,Database Design,我正在使用一种产品,几乎每个表都有这些列。作为开发人员,我们经常不得不加入到Users表中,以获得谁创建了该记录的Id,这只是一个混乱的代码 我正在设计新产品,并再次考虑这个问题。一定要这样吗?显然,知道谁创造了这项记录以及何时创造了这项记录是件好事。但是有300多个表引用同一个用户表似乎不是很好 你怎么处理这样的事情?我是否应该只在UI上最有可能需要的主要实体上创建CreatedBy列,而不是处理加入?还是我应该到处都放?或者可能有另一个“审计”表,我在其中存储所有这些信息,并仅在需要时查找(

我正在使用一种产品,几乎每个表都有这些列。作为开发人员,我们经常不得不加入到Users表中,以获得谁创建了该记录的Id,这只是一个混乱的代码

我正在设计新产品,并再次考虑这个问题。一定要这样吗?显然,知道谁创造了这项记录以及何时创造了这项记录是件好事。但是有300多个表引用同一个用户表似乎不是很好

你怎么处理这样的事情?我是否应该只在UI上最有可能需要的主要实体上创建CreatedBy列,而不是处理加入?还是我应该到处都放?或者可能有另一个“审计”表,我在其中存储所有这些信息,并仅在需要时查找(并非每次在UI上显示实体时)

我只是担心性能方面的问题,因为每个UI查询都会命中用户表


编辑:这将是SQL Server 2008 R2数据库

这种方法的问题是,您只知道谁创建了行,谁最后更改了行。如果最后一个更新行的人正在纠正前一个更新程序的错误,该怎么办


如果出于合规性或责任性的原因,您有兴趣进行全面审计,那么您可能应该研究一下。您可以指定正在审核的表,可以动态更改这些表而不必弄乱模式,并且可以专门针对这些数据编写查询,而不是将审核逻辑与常规应用程序查询逻辑混合(更不用说扩展表本身的每一行)。这也将允许您审核
选择
查询,而其他潜在的解决方案(触发器、CDC、更改跟踪-所有这些都是更多的工作,或者对于真正的审核目的来说都不完整)不允许您这样做。

我知道这是一篇较旧的帖子,但避免在用户表上查找的一种方法是对审核字段进行非规范化

因此,在CreatedBy字段中插入用户名本身,而不是用户ID。这将允许在没有用户外观的情况下查看表,还允许用户表中的任何更改不会反映在审核字段中。例如已删除的用户

我通常在表的末尾添加以下内容

IsDeleted bit default 0
CreatedBy varchar(20)
CreatedOn datetime2 default getdate()
UpdatedBy varchar(20)
UpdatedOn datetime2 default getdate()

为什么您认为“有300多个表引用同一个用户表似乎不是很好”?这是基于什么?请指定需要支持的SQL Server的最低版本。正如您所见,潜在的建议可能不适合您的版本。用正确的版本提及和/或标记问题始终是一个好主意,以节省人们的时间和精力。谢谢。@Aaron:我添加了服务器version@Oded客户机使用EntityFramework,所以它将是1。模式端混乱-大量额外的依赖项2。数据检索端混乱不堪。每次检索实体时都会加入。EF的使用与问题非常相关。你为什么不把这个细节加进去?您在问题中添加的相关信息越多(为什么您不想做某些事情,您试图实现的目标等),答案就越好。审核是在SQL Server 2008中引入的,在以前的版本中不可用。@为了公平起见,OP没有指定他们使用的SQL Server版本(2008年之前还将打折CDC和变更跟踪)。虽然不是通用的,但似乎可以合理地假设普通用户是在2008年或2008年以上,或者如果他们必须迁移到企业以利用企业功能,这样的升级将只是迁移的一部分。我知道。我只是想在答案中添加信息,而不是批评它。@Oded yep,我不是想听起来像是防御。谢谢。@Aar在上,我快速了解了SQL Server audit是如何工作的,所以可能我没有完全了解它,但我看到的是,它可能无法与单个登录一起工作?这是web应用程序,所有内容都是通过单个连接字符串输入的。