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

Sta*_*arc 1 database informix

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

Ric*_*ues 5

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

如果要检查已被授予角色但不具有数据库级访问权限的用户,则可以使用sysusers系统目录表跨过sysroleauth:

    SELECT  grantee
    FROM    sysroleauth
    MINUS
    SELECT  username
    FROM    sysusers;
Run Code Online (Sandbox Code Playgroud)

向用户或其他角色授予角色时,它不会验证是否存在.

如果您尝试向自己授予角色,除非您拥有DBSECADM,或者在GRANT语句中包含WITH GRANT OPTION关键字,并将角色分配给另一个角色,否则它只会出错.

对于后续问题:

将权限授予未被授予任何数据库级别权限的用户是否合法?

是的,这是合法的.如果您创建角色并将其分配给具有不具有数据库级权限的用户的默认值,则将授予其与数据库的隐式连接.

在这种情况下,用户只有sysusers在发出GRANT DEFAULT ROLE语句后才会显示.

其他情况:

如果使用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;
Run Code Online (Sandbox Code Playgroud)

但是,您可能只想了解systables,sysobjstatesysprocedures.

请尝试以下方法:

SELECT  owner
FROM    systables
WHERE   tabid > 99
UNION
SELECT  owner
FROM    sysobjstate  
UNION
SELECT  owner
FROM    sysprocedures
MINUS   
SELECT  username  
FROM    sysusers;
Run Code Online (Sandbox Code Playgroud)

请记住,一些内部用户一样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;
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式过滤操作系统用户uid,通常0root用户,范围[1-99]是为特殊系统用户保留的

然后,一些系统在100处为非特权用户开始UID.其他人,比如红帽,在500开始他们,还有其他人,比如Debian,在1000开始.