Informix 如何查找一个数据库中的所有用户?

Informix how to find all users in a database?

当我在数据库中创建用户时,它不会显示在数据库的 'sysusers' table 中,直到用户被授予任何数据库级别的权限,如何识别没有权限的用户在当前数据库中?

sysusers系统目录table只显示谁拥有数据库级别的访问权限。

如果您想检查已被授予角色但不持有数据库级访问权限的用户,您可以通过 sysroleauthsysusers 系统交叉目录 table:

    SELECT  grantee
    FROM    sysroleauth
    MINUS
    SELECT  username
    FROM    sysusers;

When granting a role to a user, or to another role, it will not validate if this exists.

It will only give a error if you attempt to grant a role to yourself, unless you have DBSECADM, or if you include the WITH GRANT OPTION keywords in a GRANT statement that assigns a role to another role.

后续问题:

is it legitimate to grant privilege to the user who is not granted any db level privileges?

是的,这是合法的。如果您创建一个角色并将其默认分配给没有数据库级别权限的用户,它将被授予与数据库的隐式连接。

在这种情况下,用户只会在您发出 GRANT DEFAULT ROLE 声明后出现在 sysusers 上。

Other cases:

如果用户是使用 CREATE USER statement you must look into the sysuser 数据库创建的。

如果您的意思是代表其他在数据库中没有用户的模式创建对象,您需要获得所有这些所有者。

您可以通过查询找到存储所有者的系统目录table:

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 and sysprocedures

尝试以下操作:

SELECT  owner
FROM    systables
WHERE   tabid > 99
UNION
SELECT  owner
FROM    sysobjstate  
UNION
SELECT  owner
FROM    sysprocedures
MINUS   
SELECT  username  
FROM    sysusers;

请记住,一些内部用户,如 sqljsysibmsysproc,可能会出现,因为 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过滤OS个用户,通常0root用户和范围[1-99]是为特殊系统用户保留的

然后一些系统开始为 100 的非特权用户提供 UID。其他的,比如 Red Hat,从 500 开始,还有一些,比如 Debian,从 1000.

开始