Db2 获取的表行的捕获日志

Db2 获取的表行的捕获日志,db2,sql,logging,fetch,Db2,Sql,Logging,Fetch,我正在使用(如果您有另一个数据库的解决方案,我仍然感兴趣),并试图识别从特定表中获取的每一行。解决方案需要在数据库级别,因为我无权访问导致获取的实际SELECT语句。对于从特定表中获取的每一行,我至少希望将一个或多个列值捕获到日志/表中 下面是一个例子: 表1结构 客户号(主键) 客户名称 表1(两行) 12345,乔氏蟹屋 98765,莫顿牛排馆 过程 1) 选择之前,日志文件为空 2) 执行:从表1中选择CustName,其中CustNo=12345 3) 选择后,日志文件包含: LogFi

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

下面是一个例子:

表1结构 客户号(主键)
客户名称

表1(两行) 12345,乔氏蟹屋
98765,莫顿牛排馆

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

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

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

LogFile1
---------
12345
LogFile1
---------
12345
12345
98765
4) 执行:从表1中选择*

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

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

感谢您提供的任何建议……

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

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

您必须重新考虑日志记录策略,因为仅仅插入“获取”ID是不够的。您还必须插入一些上下文信息,如谁(用户)、何时(日期)、从何处(机器)以利用这些数据


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

如果您希望调用SP来记录此信息,您可能只需要添加一个*READ触发器。无论何时从文件中读取任何记录,尝试运行某些函数都不是一个好主意,但是*read触发器可能是最有效的方法

ADDPFTRG FILE(X) TRGTIME(*AFTER) TRGEVENT(*READ) PGM(Y)
使用这种形式的命令将“只读”触发器程序(Y)添加到文件(X)中。程序Y可能应该做一些快速的事情,比如将相关的数据项推送到数据队列上。然后有一个程序的多个批处理实例,该程序从队列中提取条目并将其写入日志文件。您真的不希望只读触发器做更多的工作,数据库I/O应该从列表中删除


预计性能会受到一些影响。

从未听说过要跟踪的内容
选择
。最好的选择是让用户执行记录请求信息的
SP
。看看这个也许你能得到一些有用的信息…为什么?你需要这些信息做什么?(以及DB2的哪个版本?)。SP可能是您最好的选择—看起来触发器只处理更新。这也引出了关于当前日志表的一些问题:至少,您可能需要某种类型的语句计数器、
occurredAt
时间戳、用户凭据等。根据日志记录的原因,您可能需要保存返回的实际行(或至少特定的数据元素)!SaUce-我无法访问SELECT语句的源代码,因此无法控制如何/何时执行SELECT。我曾考虑过使用SP,但无法想出一种在SELECT.Clockwork上调用SP的方法-我们使用此信息进行清理-即,如果某一行在某个时间段内未检索到,我们将删除它。DB2的版本是AS/400DB2V5R4。如前所述,我考虑过SP,但什么会触发SP?我没有访问应用程序源的权限,因此我必须在后端捕获SELECT,即在数据库级别。谢谢你的想法。为了简洁起见,我的示例被缩减了—因此,它并不是要反映我们想要在日志中捕获的所有数据。您可以在存储过程中使用db2的日志记录功能来写入您想要记录的值(即log4db2)。