在Oracle中查找用户访问的表

3
使用 Oracle XE 10g。
我们有一个使用具有受限访问权限的数据库用户的应用程序。因为通过试错找出这个用户需要访问的表非常麻烦,所以我们正在寻找一种方法来查询 Oracle 数据字典,了解关于表访问的信息。
理想情况下,我们需要一条查询语句,可以列出此用户自某个时间点以来访问过的表的列表,并最好标明这是读取还是写入访问权限。
这样,我们就可以使用具有无限制访问权限的用户运行测试,找出它使用了哪些表,然后设置此用户仅能访问这些表。
我查看了 V$SEGMENT_STATISTICS,但它没有记录访问对象的用户。

如果你有足够的时间来收集数据,也许一个表触发器可以通过在指定的表中记录每个语句一次来为你完成这个任务,从而跟踪用户的访问。 - przemo_pl
你可能正在寻找数据库审计 - mustaccio
1
数据库审计仅适用于企业版和标准版。 - OldProgrammer
1个回答

2
你可以使用AUDIT命令来跟踪访问。但是要小心,因为这可能会产生大量数据。
启用特定用户的所有语句审核,以捕获所有访问:
audit all statements by jheller;

只有在下一次会话时才会生效。重新登录后,运行一些测试命令:

create table test1(a number);
select * from test1;
insert into test1 values(1);
delete from test1;

现在查询 DBA_AUDIT_TRAIL 来查找数据。由于审计记录中有很多无用信息,因此需要花费一些精力来缩小结果范围。

select owner, obj_name, action_name
from dba_audit_trail
where username = 'JHELLER'
    and owner = 'JHELLER'
    and timestamp > sysdate - 1
order by timestamp desc;

结果:

OWNER    OBJ_NAME  ACTION_NAME
-----    --------  --------
JHELLER  TEST1     DELETE
JHELLER  TEST1     INSERT
JHELLER  TEST1     SELECT
JHELLER  TEST1     CREATE TABLE

当我尝试该命令时,出现了错误。对我有效的是 AUDIT ALL BY username。然而,DBA_AUDIT_TRAIL 仍然为空。我需要重新启动数据库吗?还是这个功能在 XE 中没有启用? - wvdz
该命令在当前会话中不会生效。您需要注销并重新登录。 - Jon Heller
我会点赞它,因为这是一个相当不错的答案,但我不能将其作为正确答案接受,因为我已经确信这是 EE 功能的一部分。这可能是细粒度审计的一部分(https://docs.oracle.com/cd/B28359_01/license.111/b28287/editions.htm)。 - wvdz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接