2016-09-14 69 views
2

使用Oracle XE 10g。在Oracle中查找用户访问的表格

我们有一个应用程序使用访问受限的数据库用户。因为通过反复试验找出这个用户需要访问哪些表是非常麻烦的,所以我们正在寻找一种方法来查询Oracle数据字典以获取有关表访问的信息。

查询会给出该用户自某个时间点以来访问过的表的列表,最好是这是写入还是只读访问。

这样,我们可以对无限制访问的用户运行测试,找出它使用的表,然后将该用户设置为只能访问这些表。

我在看V$SEGMENT_STATISTICS,但这不会记录访问该对象的用户。

+0

如果你有足够的时间也许收集数据的表触发器会为你做这个通过在指定的表每条语句一次登录用户的访问? –

+0

您可能正在寻找[数据库审计](http://www.oracle.com/technetwork/database/security/index-085803.html) – mustaccio

+1

db审计仅适用于企业和标准版本。 – OldProgrammer

回答

1

您可以使用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 
+0

当我尝试该命令时出现错误。适合我的是'AUDIT ALL BY username'。但是,'DBA_AUDIT_TRAIL'仍然是空的。我需要重新启动数据库吗?或者XE中未启用此功能? – wvdz

+0

该命令在当前会话中不生效。您需要注销并返回。 –

+0

我喜欢它,因为这是一个很好的答案,但我不能接受它作为正确的答案,因为我已经确信这是一个EE功能。这可能是细粒度审计的一部分(https://docs.oracle.com/cd/B28359_01/license.111/b28287/editions.htm) – wvdz