捕获已获取的表行的日志

时间:2014-02-06 20:20:35

标签: sql logging db2 fetch

我正在使用(如果你有另一个数据库的解决方案,我仍然感兴趣),并且我正在尝试识别从特定表中获取的每一行。解决方案需要在数据库级别,因为我无法访问导致获取的实际SELECT语句。我至少希望将一个或多个列值捕获到从特定表中获取的每一行的日志/表中。

以下是一个例子:

表1结构

CustNo(主键)
的CustName

表1(两行)

12345,Joe's Crab Shack
98765,Morton's The Steakhouse

过程

1)在选择之前,日志文件为空

2)执行:从Table1中选择CustName,其中CustNo = 12345

3)选择后,日志文件包含:

LogFile1
---------
12345

4)执行:表1中的SELECT *

5)选择后,日志文件包含:

LogFile1
---------
12345
12345
98765

感谢您提出任何意见/建议......

2 个答案:

答案 0 :(得分:0)

如果您愿意呼叫SP来记录此信息,您可能只想添加一个* READ触发器。尝试从文件中读取任何记录时尝试运行某些函数并不是一个好主意,但* READ触发器可能是最有效的方法。

ADDPFTRG FILE(X) TRGTIME(*AFTER) TRGEVENT(*READ) PGM(Y)

使用该命令形式将“只读”触发程序(Y)添加到文件(X)。程序Y应该可以快速执行某些操作,例如将相关数据项推送到数据队列。然后有一个程序的多个批处理实例,它从队列中提取条目并将它们写入日志文件。你真的不希望只读触发器做更多的工作,数据库I / O应该不在列表中。

预计性能会受到影响。

答案 1 :(得分:-1)

您可以通过db2audit获取数据库上的操作,但无法获取使用的值。使用审计或日志记录的值会损害敏感数据。

http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002072.html

实际上,如果您为给定的表放置所有读取行的ID,就像在日志表中多次复制ID列一样。同时,它不提供任何订单上下文,因为插入行的顺序与存储或检索行的顺序不同。

您必须重新考虑您的日志记录策略,因为仅插入'fetched'ID是不够的。您还必须插入一些上下文信息,例如who(用户),when(日期),where(机器),以便利用该数据。

您可以做的另一件事是将select包装在存储过程中,并在将开始光标返回给调用者之前将ID值插入日志表中。