Как составить список схем конкретной базы данных в Informix с использованием SQL? - PullRequest
0 голосов
/ 03 февраля 2019

Что такое запрос для получения списка имен схем в конкретной базе данных в Informix?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Схемы обычно не используются в базах данных Informix и имеют очень мало возможностей отслеживания в базе данных.Нотация CREATE SCHEMA поддерживается, потому что она была частью SQL-89.Предложение AUTHORIZATION используется для определения (по умолчанию) «владельца» объектов, созданных с помощью инструкции CREATE SCHEMA.Ничто не может остановить одного пользователя, выполняющего оператор 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 было частью оператора CREATE SCHEMA, выполняемого от имени "pokemon".Не существует оператора DROP SCHEMA, который бы требовал такой поддержки.

0 голосов
/ 04 февраля 2019

Схема принадлежит пользователю.Вы можете получить список всех доступных пользователей из системного каталога :

SELECT username FROM "informix".sysusers;

Поскольку только права доступа DBA s и Resource позволяют пользователю выдаватьCREATE SCHEMA оператор , мы могли бы ограничить запрос следующим образом:

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

Другое решение состоит в том, чтобы перечислять только пользователей, которые фактически создали таблицы;для этого вы можете запросить системный каталог systables и перечислить различных владельцев.

SELECT DISTINCT owner FROM FROM "informix".systables

Как прокомментировал @JonathanLeffler, пользователь мог получить RESOURCE привилегии и создали таблицу, а затем «понижен в должности» до CONNECT привилегий.Пользователь по-прежнему будет владельцем таблицы.Следовательно, второе решение является наиболее точным.

...