如何使用 SQL 列出 Informix 中特定数据库的模式?

How to list schemas of a specific database in Informix using SQL?

在 Informix 中获取特定数据库中模式名称列表的查询是什么?

架构属于用户。您可以列出来自 the sysusers system catalog 的所有可用用户:

SELECT username FROM "informix".sysusers;

因为只有 DBAs 和 Resource 权限允许用户发出 CREATE SCHEMA statement,我们可以像这样限制查询:

SELECT username FROM "informix".sysusers WHERE usertype IN ('D', 'R');

另一个解决方案是仅列出实际创建了 tables 的用户;为此,您可以查询 the systables system catalog 并列出不同的所有者。

SELECT DISTINCT owner FROM FROM "informix".systables

正如@JonathanLeffler 评论的那样,用户可能已被授予 RESOURCE 权限并创建了 table,然后成为 'demoted' 到 CONNECT 权限。用户仍将拥有 table。因此,第二种解决方案是最准确的。

模式在 Informix 数据库中并不常用,并且在数据库中几乎没有可跟踪性。支持 CREATE SCHEMA 表示法,因为它是 SQL-89 的一部分。 AUTHORIZATION 子句用于确定使用 CREATE SCHEMA 语句创建的对象的(默认)'owner'。没有什么可以阻止单个用户多次 运行 CREATE SCHEMA 语句,无论是连续的还是在广泛不同的时间(在 Informix 实例中的任何给定数据库中)。

CREATE SCHEMA AUTHORIZATION "pokemon"
    CREATE TABLE gizmo (s SERIAL NOT NULL PRIMARY KEY, v VARCHAR(20) NOT NULL)
    CREATE TABLE widget(t SERIAL NOT NULL PRIMARY KEY, d DATETIME YEAR TO SECOND NOT NULL)
    ;

CREATE SCHEMA AUTHORIZATION "pokemon"
    CREATE TABLE object   (u SERIAL NOT NULL PRIMARY KEY, i INTEGER NOT NULL)
    CREATE TABLE "pikachu".complain (C SERIAL NOT NULL PRIMARY KEY, v VARCHAR(255) NOT NULL)
    ;

在执行 CREATE SCHEMA 语句后,无法跟踪这些表中的任何一对是作为同一模式的一部分一起创建的;没有办法知道 "pikachu".complain 是代表 "pokemon" 执行的 CREATE SCHEMA 语句的一部分。没有需要此类支持的 DROP SCHEMA 语句。