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

时间:2016-03-30 06:22:08

标签: database informix

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

1 个答案:

答案 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;

但您可能只想了解systablessysobjstatesysprocedures

尝试以下方法:

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过滤操作系统用户,通常 0 root用户,范围 [1- 99] 保留给特殊系统用户

然后,某些系统为 100 的非特权用户开始 UID 。其他人,比如Red Hat,以 500 开始,还有其他人,比如Debian,以 1000 开始。