首页 > 解决方案 > 在 dba_users 中查找记录而不是在单个用户表中

问题描述

我在 Oracle 11g 中有以下问题:

我有一个表 TBL_PERSON 列出了我的应用程序的所有用户,我需要找出 TBL_PERSON 中未提及的所有数据库用户。

tbl_person 的计数是 4207。

dba_users/all_users 的计数是 4244。这意味着,37 个用户的差异是不使用应用程序的系统用户。

到目前为止,一切都很好。如何识别系统用户?

表 INT_PERSON 中的 ID 等于 dba_users 中的 USER_ID。我期望 dba_users 表中未在 INT_PERSON 中列出的所有用户的列表。(37 行)

我尝试了以下方法:

 SELECT * 
      FROM dba_users 
     WHERE USER_ID 
       NOT 
        IN (SELECT ID 
              FROM LCM.TBL_INT_PERSON); 

结果是 3804 行,还显示来自 INT_PERSON 的用户 -> 不是我所期望的

然后尝试:

SELECT * 
  FROM dba_users a 
 WHERE USER_ID 
   NOT 
    IN (SELECT ID 
          FROM LCM.TBL_INT_PERSON b 
          where b.id = a.User_id);

这没什么区别。

这些帖子不能解决我的问题:

查找一个表中不存在另一表中的匹配列数据的记录

从一个表中选择另一个表中不存在的记录

或者它是 dba_users 表的秘密?我的错误在哪里?

标签: sqloracle

解决方案


如何识别系统用户?

首先验证应用程序用户的数量。此查询应返回应用程序用户的所有 ID,即 4207 如果不是 - 您有其他问题,而不是您描述的问题。

select USER_ID from  dba_users
INTERSECT 
select ID from TBL_INT_PERSON;

现在显示系统用户

select USER_ID from  dba_users
MINUS
select ID from TBL_INT_PERSON;

这应该返回系统用户的 ID。

一般说明 -count(*)两个表的简单减法可能会产生误导,因为表中可能存在重复的键和空值。使用上述设置操作更安全。


推荐阅读