【问题标题】:Find out who deleted the row in the DB找出谁删除了数据库中的行
【发布时间】:2014-08-04 15:36:38
【问题描述】:

我们有一个包含大约 4K 表的 Oracle 数据库。以及大约 30 个不同的应用程序访问数据。我们有一个问题,其中一个应用程序正在删除我们的一个表中的一行。我们不知道哪个应用程序以及为什么。我试图弄清楚,但是,我首先想到的是在删除某些内容并记录它时使用触发器,但是,有没有办法找出哪个应用程序在 oracle 中删除了它?

谢谢

【问题讨论】:

  • 来自触发器内? v$session 可能会告诉您,如果应用程序正确识别自己,但它可能只是说一些通用的东西,比如 JDBC;或者,如果应用程序位于单独的框中,您可以获得会话的 IP 地址。您是否考虑过内置的审计工具?
  • 启用补充日志记录后,确定哪个用户做了什么将是微不足道的。
  • @AlexPoole 我不是 Oracle 专家,我会研究内置的审计工具。我只是在寻找关于从哪里开始的指针。请让我知道答案中是否还有其他方式。谢谢。
  • 不同的应用程序是否有不同的凭据,或者它们都以同一用户身份连接到数据库?
  • This might be useful toov$session(和相关视图)和sys_context 可以显示类似的信息,但只会显示应用程序名称,如果它设置它,我怀疑这不太可能,你只会看到 JDBC。堆栈跟踪可能会为您提供线索。不过没有灵丹妙药。

标签: java sql oracle


【解决方案1】:

如果您不想走 autiting 或 logging 路线,并且应用程序与 v$session 没有区别,您可以通过调用来设置应用程序的名称

dbms_application_info.set_client_info('my_application');

这将为会话设置 v$session.client_info,您可以通过

读取
dbms_application_info.read_client_info(client_info out varchar2);.

然后您可以使用触发器并记录此值。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2013-05-10
    • 2017-05-03
    • 2011-02-26
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多