2009-01-08 103 views
0

我在工作中遇到数据库问题。目前正在进行审计,但其笨拙,需要很多维护,而且在一些方面缺乏。所以我正在取代它。MS SQL审计

我想以尽可能通用的方式做到这一点,并设计了表格,以及如何链接和更新所有内容。

现在,这一切都很好,但我希望能够写一个通用的方式来插入记录到这些审计表。 (无需为每个表中的每列都输入一条命令)

反正在存储过程中迭代表中的所有列吗?我想以这种方式编写它,它将与多个表一起工作,并自动拾取和审计添加的列等。

任何想法?

编辑:猜猜我应该澄清。我将审核表中的数据。但是我将使用相同的表来存储数据库中每个表的审计数据。

而且我不能使用触发器,因为通常,当更新发生时,它会发生在多个表中,但我希望所有这些更新都是单个更改集的一部分。

这不是问题,因为我可以在单个存储过程中执行所有更新。我只是喜欢像循环一样的方式,我可以得到所有更新的字段,找出哪些更改,并将更改后的插入到审计表中。

我想这样做没有一长串if语句和每列插入语句。 (通过在通用循环中执行此操作,它将自动处理添加的列,而不会受到删除列的困扰)

回答

0

会出现性能方面的问题,但您可以将插入和更新触发器添加到所有表中,触发器插入到您的审计表中。

+0

我宁愿不必这样做,因为那样我就不得不提前知道每一列。我希望这个系统能够自动选择新的列,并且在没有任何干预的情况下忽略已删除的列。我想做一切从存储特效。 – TJMonk15 2009-01-08 18:50:02

+0

我可以理解想要通过procs做所有事情,但使用COLUMNS_UPDATED(),你应该能够确定哪些列被更新,而不必知道表中的列是什么。 – cmsjr 2009-01-08 18:56:06

1

通过“添加列”我想你正在审计DDL。如果你使用SQL 2005,那么你想要this link

如果不使用SQL 2005,那么您可能要使用SQL模式比较工具之一,比如SQL Red Gates工具集可能有一些内容。

如果您没有$ for工具,那么您可能只想对information_schema.tables和information_schema.columns运行定期查询。通过定期采集这些在permenant表,可以识别时,他们已获得或失去行(并因此改变了模式发生)

如果你正在做数据审核,而不是,那么你要想要的代码生成一些触发器,再次使用information_schema.tables和information_schema.columns。

0

这可能,如果你使用的是数据访问层可以捕获哪些表和列正在更新,并生成审计表的INSERT语句来完成。在存储过程中?哪个存储过程?你有单一的更新吗?或者你是每桌创建一个?

0

如果这是您的选择,只需升级到sql server 2008并打开更改数据捕获。