每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.
这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:
我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.
我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:
我知道的方法是:
1.为创建和修改的日期和用户添加列
表格示例:
主要缺点:我们失去了修改的历史.提交后无法回滚.
2.仅插入表格
表格示例:
主要缺点:如何保持外键最新?需要巨大的空间
3.为每个表创建单独的历史记录表
历史表示例:
主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.
4.为所有表创建合并历史记录表
历史表示例:
主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.
我需要创建一个数据库表来存储不同的更改日志/审核(当添加,删除,修改等内容时).我不需要存储特别详细的信息,所以我想的是:
我在这里错过了什么吗?显然我可以继续改进设计,虽然我不打算让它变得复杂(为事件类型创建其他表格或类似的东西是不可能的,因为它是我需要的复杂因素).
我希望能够跟踪文件,看看哪个进程正在触摸该文件.那可能吗?我知道我可以在活动监视器中看到打开进程的列表,但我认为很快就能让我看到它.原因是我正在使用框架,我认为正在使用框架的系统版本而不是调试版本,我想看看哪个进程正在触及它.
我经常更频繁地看到这两个词,但我没有看到太多不同?我的意思是想知道它们是否可以互换使用,或者这两者有什么不同?谢谢.
我在C#中有我的核心项目.
我在一个数据库上工作,其中一些表有"user_mod"和"date_mod"列用于签名谁和什么时候做了一些mods和"data_new"和"user_new"相同.
我的问题:有没有办法集中这个并自动插入这些数据,我在哪里创建实例dbContext?
如果没有,我将使用审计跟踪工具.我见过其中的一些,但是有一个问题:所有这些,需要我的模型中的一些代码.但是我不想在我的模型中写,因为如果我必须改变它,我将失去mod.是否可以在不写入模型文件的情况下使用EF6的审计跟踪?怎么样?
编辑:
我试图覆盖saveChanges.
public partial class PieEntities : DbContext
{
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
var timestamp = DateTime.Now;
EntityState es = EntityState.Added;
ObjectStateManager o = new ObjectStateManager();
foreach (ObjectStateEntry entry in o.GetObjectStateEntries(EntityState.Added )) {
if (entry.Entity.GetType() == typeof(TabImpianti)) {
TabImpianti impianto = entry.Entity as TabImpianti;
impianto.DATA_INS = timestamp;
impianto.DATA_MOD = timestamp;
string u = mdlImpostazioni.p.UserName;
impianto.USER_INS = u;
impianto.USER_MOD = u;
}
}
return base.SaveChanges(options);
}
}
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2005中,是否有一种删除行并被告知实际删除了多少行的方法?
我可以select count(*)用相同的条件做一件事,但我需要这完全值得信赖.
我的第一个猜测是使用@@ROWCOUNT变量 - 但是没有设置,例如
delete
from mytable
where datefield = '5-Oct-2008'
select @@ROWCOUNT
Run Code Online (Sandbox Code Playgroud)
总是返回0.
MSDN建议OUTPUT构建,例如
delete from mytable
where datefield = '5-Oct-2008'
output datefield into #doomed
select count(*)
from #doomed
Run Code Online (Sandbox Code Playgroud)
这实际上失败了,语法错误.
有任何想法吗?
在MySQL中,我厌倦了添加列dt_created和dt_modified(分别是创建和最后修改的日期时间戳)到我的数据库中的所有表.
每次我INSERT或UPDATE数据库,我都必须使用NOW()关键字.这完全是我的坚持.
是否有任何有效的替代方案,MySQL可以自动存储至少插入的行的数据时间,让我检索它?
如何在数据库中维护数据日志?
我必须记录每行所做的每个更改.这意味着我不能允许DELETE和UPDATE执行.
我怎么能保留这样的日志?
我过去使用的一个简单方法基本上就是创建第二个表,其结构镜像我想要审计的表,然后在主表上创建更新/删除触发器.在更新/删除记录之前,当前状态将通过触发器保存到审计表中.
虽然有效,但审计表中的数据并不是最有用或最简单的报告.我想知道是否有人有更好的方法来审核数据变化?
这些记录的更新不应太多,但它是高度敏感的信息,因此对客户而言,所有更改都经过审核并易于报告,这一点非常重要.
我正在使用实体框架在更改历史/审核日志中构建我的MVC应用程序.
因此,在编辑方法中public ActionResult Edit(ViewModel vm),我们找到了我们正在尝试更新的对象,然后使用TryUpdateModel(object)将表单中的值转置到我们尝试更新的对象上.
我想在该对象的任何字段更改时记录更改.所以基本上我需要的是在编辑对象之前复制一个对象,然后在TryUpdateModel(object)完成它的工作之后对它进行比较.即
[HttpPost]
public ActionResult Edit(ViewModel vm)
{
//Need to take the copy here
var object = EntityFramework.Object.Single(x=>x.ID = vm.ID);
if (ModelState.IsValid)
{
//Form the un edited view model
var uneditedVM = BuildViewModel(vm.ID); //this line seems to confuse the EntityFramework (BuildViewModel() is used to build the model when originally displaying the form)
//Compare with old view model
WriteChanges(uneditedVM, vm);
...
TryUpdateModel(object);
}
...
}
Run Code Online (Sandbox Code Playgroud)
但问题是当代码检索"未编辑的虚拟机"时,这会导致EntityFramework中的一些意外更改 - 因此TryUpdateModel(object);抛出一个UpdateException …
audit ×10
database ×3
c# ×2
logging ×2
sql ×2
sql-server ×2
asp.net-mvc ×1
audit-trail ×1
datetime ×1
java ×1
lsof ×1
macos ×1
mysql ×1
sql-delete ×1
t-sql ×1
terminal ×1
unix ×1