标签: audit

审计日志的数据库设计

每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.

这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:

我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.

我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:

  • 数据库模式的成熟度
  • 如何查询日志
  • 需要重新创建记录的概率
  • 更重要的是:写或读性能
  • 正在记录的值的性质(字符串,数字,blob)
  • 存储空间可用

我知道的方法是:

1.为创建和修改的日期和用户添加列

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 创建日期
  • 修改日期
  • 由...制作
  • modified_by

主要缺点:我们失去了修改的历史.提交后无法回滚.

2.仅插入表格

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 删除(布尔值)
  • 用户

主要缺点:如何保持外键最新?需要巨大的空间

3.为每个表创建单独的历史记录表

历史表示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • VALUE_4
  • 用户
  • 删除(布尔值)
  • 时间戳

主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.

4.为所有表创建合并历史记录表

历史表示例:

  • TABLE_NAME
  • 领域
  • 用户
  • NEW_VALUE
  • 删除(布尔值)
  • 时间戳

主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.

audit logging database-design

143
推荐指数
4
解决办法
8万
查看次数

更改日志/审计数据库表的最佳设计?

我需要创建一个数据库表来存储不同的更改日志/审核(当添加,删除,修改等内容时).我不需要存储特别详细的信息,所以我想的是:

  • id(用于活动)
  • 触发它的用户
  • 事件名称
  • 事件描述
  • 事件的时间戳

我在这里错过了什么吗?显然我可以继续改进设计,虽然我不打算让它变得复杂(为事件类型创建其他表格或类似的东西是不可能的,因为它是我需要的复杂因素).

database audit database-design

105
推荐指数
6
解决办法
9万
查看次数

查看在Mac OS X中使用文件的进程

我希望能够跟踪文件,看看哪个进程正在触摸该文件.那可能吗?我知道我可以在活动监视器中看到打开进程的列表,但我认为很快就能让我看到它.原因是我正在使用框架,我认为正在使用框架的系统版本而不是调试版本,我想看看哪个进程正在触及它.

unix macos terminal audit lsof

88
推荐指数
5
解决办法
7万
查看次数

审计和记录方面的差异?

我经常更频繁地看到这两个词,但我没有看到太多不同?我的意思是想知道它们是否可以互换使用,或者这两者有什么不同?谢谢.

java audit logging

54
推荐指数
6
解决办法
3万
查看次数

实体框架6:审计/跟踪变更

我在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)

更新:我在这里总结了解决方案.

c# audit entity-framework audit-trail entity-framework-6

47
推荐指数
3
解决办法
6万
查看次数

计算SQL Server存储过程中已删除行的数量

在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)

这实际上失败了,语法错误.

有任何想法吗?

t-sql sql-server audit sql-delete

46
推荐指数
4
解决办法
6万
查看次数

MySQL自动存储每行的日期时间

在MySQL中,我厌倦了添加列dt_createddt_modified(分别是创建和最后修改的日期时间戳)到我的数据库中的所有表.

每次我INSERTUPDATE数据库,我都必须使用NOW()关键字.这完全是我的坚持.

是否有任何有效的替代方案,MySQL可以自动存储至少插入的行的数据时间,让我检索它?

mysql sql audit datetime

44
推荐指数
3
解决办法
7万
查看次数

关于捕获审计跟踪的数据库设计的想法

如何在数据库中维护数据日志?

我必须记录每行所做的每个更改.这意味着我不能允许DELETEUPDATE执行.

我怎么能保留这样的日志?

database audit database-design

41
推荐指数
4
解决办法
2万
查看次数

在SQL Server中实现审计表的建议?

我过去使用的一个简单方法基本上就是创建第二个表,其结构镜像我想要审计的表,然后在主表上创建更新/删除触发器.在更新/删除记录之前,当前状态将通过触发器保存到审计表中.

虽然有效,但审计表中的数据并不是最有用或最简单的报告.我想知道是否有人有更好的方法来审核数据变化?

这些记录的更新不应太多,但它是高度敏感的信息,因此对客户而言,所有更改都经过审核并易于报告,这一点非常重要.

sql database sql-server audit

31
推荐指数
2
解决办法
1万
查看次数

使用MVC和实体框架实现审核日志/更改历史记录

我正在使用实体框架在更改历史/审核日志中构建我的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 …

c# asp.net-mvc audit entity-framework

31
推荐指数
2
解决办法
4万
查看次数