【发布时间】:2015-06-30 07:03:19
【问题描述】:
我有一个已经很复杂的 SQL 语句,它创建了一个用户表,这些用户拥有CONNECT、APPUSER 或两者的权限:
(SELECT b.grantee AS "Username", A.granted_role AS "Connect", b.granted_role AS "APPUSER" FROM
(SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role = 'CONNECT') A
RIGHT OUTER JOIN
(SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role = 'APPUSER') b
ON A.grantee=b.grantee)
UNION
(SELECT A.grantee, A.granted_role, b.granted_role FROM
(SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role = 'CONNECT') A
LEFT OUTER JOIN
(SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role = 'APPUSER') b
ON A.grantee=b.grantee)
这会产生类似:
Username Connect APPUSER
--------- --------- ---------
Sue CONNECT APPUSER
Bob (null) APPUSER
Joe CONNECT (null)
我希望使用all_users 表来显示没有权限的用户。all_users 表显示数据库中的每个用户。
我尝试在我的 SQL 语句末尾添加几种类型的连接来实现这一点。我得到的最接近的是添加:
UNION
(SELECT username, NULL, NULL FROM all_users)
这将生成一个列表,其中每个用户显示两次,但显示的用户没有任何权利:
Username Connect APPUSER
--------- --------- ---------
Amy (null) (null)
Sue CONNECT APPUSER
Sue (null) (null)
Bob (null) APPUSER
Bob (null) (null)
Joe CONNECT (null)
Joe (null) (null)
我尝试添加 where username = a.grantee,但这不适用于 Unions。如果我尝试用任何JOINs 替换UNION,比如添加:
FULL OUTER JOIN
SELECT username, NULL, NULL FROM ALL_USERS
on username = a.grantee;
我得到错误:
“SQL 命令未正确结束”
【问题讨论】: