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

时间:2019-02-03 20:42:37

标签: sql database informix

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

2 个答案:

答案 0 :(得分:3)

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

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声明需要这种支持。

答案 1 :(得分:2)

模式属于用户。您可以从the sysusers system catalog列出所有可用用户:

SELECT username FROM "informix".sysusers;

由于只有DBAResource特权允许用户发布CREATE SCHEMA statement,因此我们可以像这样限制查询:

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

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

SELECT DISTINCT owner FROM FROM "informix".systables

正如@JonathanLeffler所评论的那样,可以向用户授予RESOURCE特权并创建表,然后将其“降级”为CONNECT特权。用户仍将拥有该表。因此,第二种解决方案是最准确的。