当我在数据库中创建用户时,它没有显示在' sysusers'数据库表,直到授予用户任何数据库级权限,如何识别当前数据库中没有权限的用户?
答案 0 :(得分:5)
sysusers系统目录表仅显示谁拥有数据库级访问权限。
如果要检查已被授予角色但未拥有数据库级访问权限的用户,可以使用sysroleauth系统目录表跨越sysusers:
SELECT grantee
FROM sysroleauth
MINUS
SELECT username
FROM sysusers;
向用户或其他角色授予角色时,不会验证该角色是否存在。
如果您尝试向自己授予角色,除非您拥有DBSECADM,或者在WITH GRANT OPTION语句中包含GRANT个关键字,否则只会出现错误角色扮演另一个角色。
关于后续问题:
将权限授予未被授予任何数据库级别权限的用户是否合法?
是的,这是合法的。如果您创建了一个角色并且已将其分配给具有不具有数据库级权限的用户的默认角色,则将为其授予与数据库的隐式连接。
在这种情况下,用户只有在您发出GRANT DEFAULT ROLE声明后才会显示在sysusers
上。
其他情况:
如果使用CREATE USER语句创建用户,则必须查看sysuser数据库。
如果您的意思是代表数据库中没有用户的其他模式创建对象,则需要获取所有这些所有者。
您可以通过查询找到存储所有者的系统目录表:
SELECT UNIQUE t.tabname
FROM systables t
INNER JOIN syscolumns c ON (t.tabid = c.tabid)
WHERE c.colname = 'owner' AND t.tabid < 100
ORDER BY 1;
但您可能只想了解systables,sysobjstate和sysprocedures。
尝试以下方法:
SELECT owner
FROM systables
WHERE tabid > 99
UNION
SELECT owner
FROM sysobjstate
UNION
SELECT owner
FROM sysprocedures
MINUS
SELECT username
FROM sysusers;
请注意,可能会显示某些内部用户,例如sqlj
,sysibm
和sysproc
,因为sysprocedures
未过滤内部用户。
如果您想查看所有没有数据库级访问权限的 OS 用户,您可以在UNIX中执行以下操作:
CREATE TEMP TABLE os_users(
username CHAR(32),
password CHAR(1),
uid INT,
gid INT,
gecos CHAR(256),
home_dir CHAR(256),
shell CHAR(32)
) WITH NO LOG;
LOAD FROM '/etc/passwd' DELIMITER ':'
INSERT INTO os_users;
SELECT username
FROM os_users
MINUS
SELECT username
FROM sysusers;
您可以按uid
过滤操作系统用户,通常 0 是root
用户,范围 [1- 99] 保留给特殊系统用户
然后,某些系统为 100 的非特权用户开始 UID 。其他人,比如Red Hat,以 500 开始,还有其他人,比如Debian,以 1000 开始。