AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 9960
Accepted
Lumpy
Lumpy
Asked: 2011-12-31 08:02:39 +0800 CST2011-12-31 08:02:39 +0800 CST 2011-12-31 08:02:39 +0800 CST

数据变更审计计划

  • 772

我的公司正在从分布式 Access 数据库模型转变为使用集中式 SQL 数据库。数据表的设计使得所有表都有修改日期。在讨论中有人建议,因为我们将在每个表上创建一个触发器来处理修改日期,也许我们应该让触发器也将一些信息记录到审计表中。

这是设置审计的最佳方式以便我们可以跟踪谁在更改信息还是有更好的方式?欢迎链接到有关该主题的文章。

对于审计,我正在寻找捕获表名、列名、修改日期、行 ID 和进行更改的人的用户名。是否有任何我没有想到的信息应该被捕获,以帮助我避免未来的陷阱?

sql-server audit
  • 4 4 个回答
  • 910 Views

4 个回答

  • Voted
  1. Best Answer
    ConcernedOfTunbridgeWells
    2011-12-31T11:05:59+08:002011-12-31T11:05:59+08:00

    不要费心在每个字段的基础上跟踪审计数据。拥有一个与主表具有相同结构并在表上跟踪时间戳和用户信息的审计表要容易得多。

    这种架构有几个优点:

    • 您可以轻松创建跨主表和审计表的视图,以显示包括当前版本在内的完整历史记录。
    • 审计触发器的实现相对简单——事实上,如果你有大量的表,你可以编写一个实用程序从系统数据字典中生成它们。
    • 审计表可以放在单独的磁盘上,以减少主表在磁盘上的 I/O 负载。
    • 重建记录的原样版本非常容易,而不必反向应用字段级更改列表。

    审计信息应至少包括:创建/更改记录的用户、创建/更改的日期/时间、更改的性质(插入、更新、删除)。如果您可以选择这样做,您可能希望使用逻辑删除(即“已删除”标志)。否则,您需要从会话中捕获用户和日期/时间并将它们放在删除记录中,可能连同记录的最后状态。如果这在连接中不可用(通常是在 N 层应用程序中用户未在数据库级别被模拟的情况),那么您需要找到其他方法来获取它。

    • 7
  2. gonsalu
    2011-12-31T13:21:46+08:002011-12-31T13:21:46+08:00

    如果您使用的是 SQL Server 2008 Enterprise Edition 或更新版本,您还可以考虑使用Change Data Capture,它:

    • 对系统的影响比触发器低;
    • 涵盖您提到的场景;
    • 审计逻辑已被证明内置于 SQL Server 中(而不是您必须自己实现的触发器)。
    • 3
  3. ecarden
    2013-05-08T11:24:43+08:002013-05-08T11:24:43+08:00

    遗憾的是,CDC 无法作为替代品。

    CDC 在捕获数据变化时不包括 WHO;只有什么和什么时候。如果您不需要知道是谁做出了改变,那么 CDC 将发挥作用,但如果 WHO 与什么和什么时候一样重要,那么可悲的是,CDC 达不到要求;很短。

    • 1
  4. Ivan Stankovic
    2014-05-22T05:59:59+08:002014-05-22T05:59:59+08:00

    您可以通过审计触发器执行此操作,审计触发器提供审计数据更改作为对以下问题的回答:

    1. 谁更改了数据?
    2. 发生变化的日期和时间是什么时候?
    3. 使用哪个客户端软件访问数据?
    4. 如果请求是数据修改(UPDATE 语句),更改前后的数据值是多少?

    这意味着当触发触发器时,所有这些信息都必须从数据库或 SQL Server 实例中收集并存储在审计存储库中。例如,当记录插入 Currency.Sales 表时触发触发器是使用以下 SQL

    CREATE TRIGGER Sales.tr_i_AUDIT_Currency
    ON Sales.Currency
        FOR INSERT
        NOT FOR REPLICATION
    AS
    

    然后,触发器必须插入执行 INSERT 的计算机名、插入记录的人的用户名和用于插入记录的应用程序的名称。触发器利用内置的 SQL Server 函数来获取这些值:

    • HOST_NAME() 返回工作站名称
    • APP_NAME() 返回当前会话中应用程序的名称
    • SUSER_SNAME() – 返回登录名
    • GETDATE() – 返回当前连接的数据库的系统时间戳

    这些值存储在用作审计数据存储库的预定义表中

    INSERT
    INTO AdventureWorks2012.dbo.AUDIT_LOG_TRANSACTIONS
    (
         TABLE_NAME,
         TABLE_SCHEMA,
         AUDIT_ACTION_ID,
         HOST_NAME,
         APP_NAME,
         MODIFIED_BY,
         MODIFIED_DATE,
         [DATABASE]
    )
    VALUES(
    'Currency',
    'Sales',
    2, --   ACTION ID For INSERT
    CASE
    WHEN
           LEN(HOST_NAME())
           <
           1 THEN ' '
        ELSE HOST_NAME()
    END,
    CASE
    WHEN
           LEN(APP_NAME())
           <
           1 THEN ' '
        ELSE APP_NAME()
    END,
    SUSER_SNAME(),
    GETDATE(),
    'AdventureWorks2012'
    );
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve