【发布时间】:2016-09-06 19:27:32
【问题描述】:
考虑一个模式下的表(学生)说候选人(不是 DBA):
学生
{RollNumber : VARCHAR2(10),
姓名 : VARCHAR2(100),
CLass : VARCHAR2(5),
.. .
...
...
}
让我们假设该表已经包含一些有效数据。
我执行了一个更新查询来修改学生表的名称和类
UPDATE STUDENT SET Name = 'ASHWIN' , CLASS = 'XYZ'
WHERE ROLLNUMBER = 'AQ1212'
随后是另一个更新查询,我在其中更新了一些其他字段
UPDATE STUDENT SET Math_marks = 100 ,PHY_marks , CLASS = 'XYZ'
WHERE ROLLNUMBER = 'AQ1212'
因为我在两个不同的查询中修改了不同的列。我需要获取在上次事务中更新的特定列列表。我很确定 oracle 必须在 DBA 可以访问的一些表日志中维护这一点。但我没有 DBA 访问权限。
我需要的只是在架构候选人下的最后一个事务中更新的列列表我没有拥有 DBA 权限
请给我一些建议。
注意:上面我提到了一个简单的表格。但实际上我有 8-10 个表,我需要对其进行审计,其中一个关键因素可以说 ROLLNUMBER 充当所有其他表的外键。编写触发器对于所有表来说都是复杂的。因此,如果有其他方法可以获取相同的内容,请帮助我。
【问题讨论】:
-
您的真正意思是“交易”还是“声明”?一笔交易由多条语句组成。两个更新可能在同一个事务中。 “最后一笔交易”对您意味着什么?当前会话中的最后一个事务?当前会话中的最后一条语句?还是您真的要遍历所有会话?听起来您需要启用某种审计功能——您不想扫描事务日志以查找此类事情。可能是历史表,其中行的先前版本是通过触发器写入的。
-
如果您使用“ROWDEPENDENCIES”创建表,则可以跟踪那些已更新的行。当您使用 ROWDEPENDENCIES 创建表时,您将看到新的 rowscn 伪列。 ora_rowscn 在读取表时提供与表中每个单独行关联的系统更改号 (SCN)。当最后一次 DML 在表的块或行级别执行时,该列提供 SCN(系统更改编号)。使用函数 SCN_TO_TIMESTAMP 可以轻松地将 SCN 系统更改号转换为时间戳。
-
@Raj_Te - 这会大致告诉您更新行的时间(存在问题,但对于大多数用途来说可能已经足够接近)。这并不能告诉您更新了哪些列,这就是这个问题的全部内容。
-
@JustinCave..同意..除了创建触发器或一些历史表之外,我们无法实现 OP 的需求。最多他可以知道一行是否正在更新,这就是我试图传达的内容。
-
@R@JustinCave .. 我希望为每个更新语句执行此操作。(遍历所有会话)除了触发器或历史表还有其他方法吗?