Таблицы
Таблицы и представления близки между собой по "внешнему виду", не смотря на то, что по сути своей это разные объекты. Но мы часто обращаемся к ним в базе данных, используя аналогичные конструкции языка, и не задумываемся об их внутренней организации. Видимо это обстоятельство и послужило основой тому, что информация о них хранится в служебных таблицах вместе.
Приведенный запрос позволяет получить перечень таблиц и представлений, исходный код представлений, их описание, данное пользователем, имя, количество полей и хозяина таблицы или представления.
SELECT RDB$RELATIONS.RDB$VIEW_SOURCE, RDB$RELATIONS.RDB$DESCRIPTION, RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATIONS.RDB$FIELD_ID, RDB$RELATIONS.RDB$OWNER_NAME FROM RDB$RELATIONS WHERE ( (RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) ) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
Выражение RDB$RELATIONS.RDB$SYSTEM_FLAG = 0 позволят отобрать только объекты, созданные пользователем. Наложив на запрос еще одно условие (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL), можно получить перечень только таблиц.
SELECT RDB$RELATIONS.RDB$DESCRIPTION, RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATIONS.RDB$FIELD_ID, RDB$RELATIONS.RDB$OWNER_NAME FROM RDB$RELATIONS WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL )) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
Замена описанного выше условия на обратное (RDB$RELATIONS.RDB$VIEW_SOURCE IS NOT NULL) позволит получить только перечень представлений.
SELECT RDB$RELATIONS.RDB$DESCRIPTION, RDB$RELATIONS.RDB$VIEW_SOURCE, RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATIONS.RDB$FIELD_ID, RDB$RELATIONS.RDB$OWNER_NAME FROM RDB$RELATIONS WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NOT NULL )) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
Каждое изменение методанных таблицы фиксируется сервером в таблице RDB$FORMATS и таких изменений может быть только 256. По достижении данной границы необходимо выполнить backup/restore для сброса этих счетчиков.
Приведенный ниже запрос позволяет нам узнать, сколько уже было сделано изменений для каждой таблицы.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, MAX( RDB$FORMATS.RDB$FORMAT ) MAX_OF_RDB$FORMAT FROM RDB$RELATIONS INNER JOIN RDB$FORMATS ON (RDB$RELATIONS.RDB$RELATION_ID = RDB$FORMATS.RDB$RELATION_ID) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL)) GROUP BY RDB$RELATIONS.RDB$RELATION_NAME ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
Все таблицы состоят из полей. Посмотрим, из каких полей состоит та или иная таблица. Информация о полях таблиц содержится в служебной таблице RDB$RELATION_FIELDS. Приведенный ниже запрос выдаст имя таблицы, имя поля, порядковый номер поля в таблице, имя домена (RDB$FIELD_SOURCE), на котором данное поле базируется, возможность ввести NULL (RDB$NULL_FLAG <> 1) и значение по умолчанию.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION, RDB$RELATION_FIELDS.RDB$FIELD_SOURCE, RDB$RELATION_FIELDS.RDB$NULL_FLAG, RDB$RELATION_FIELDS.RDB$DEFAULT_SOURCE FROM RDB$RELATION_FIELDS INNER JOIN RDB$RELATIONS ON (RDB$RELATION_FIELDS.RDB$RELATION_NAME = RDB$RELATIONS.RDB$RELATION_NAME) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL)) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION;
Если включить в запрос информацию из таблицы RDB$FIELDS (описание доменов), то можно получить дополнительную информацию о каждом поле. Такой информацией может быть выражение для вычислимых полей и тип поля базы данных.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION, RDB$RELATION_FIELDS.RDB$FIELD_SOURCE, RDB$RELATION_FIELDS.RDB$NULL_FLAG, RDB$RELATION_FIELDS.RDB$DEFAULT_SOURCE, RDB$FIELDS.RDB$COMPUTED_SOURCE, RDB$FIELDS.RDB$DEFAULT_SOURCE, RDB$FIELDS.RDB$FIELD_TYPE, RDB$FIELDS.RDB$NULL_FLAG FROM RDB$RELATIONS INNER JOIN RDB$RELATION_FIELDS ON (RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME) INNER JOIN RDB$FIELDS ON (RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL)) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION;
Приведенный ниже запрос написан с включением в него таблицы RDB$TYPES, из которой можно получить текстовое описание типа поля.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION, RDB$RELATION_FIELDS.RDB$FIELD_SOURCE, RDB$RELATION_FIELDS.RDB$NULL_FLAG, RDB$RELATION_FIELDS.RDB$DEFAULT_SOURCE, RDB$FIELDS.RDB$COMPUTED_SOURCE, RDB$FIELDS.RDB$DEFAULT_SOURCE, RDB$FIELDS.RDB$NULL_FLAG, RDB$FIELDS.RDB$FIELD_TYPE, RDB$TYPES.RDB$TYPE_NAME, RDB$FIELDS.RDB$FIELD_SUB_TYPE, RDB$FIELDS.RDB$FIELD_LENGTH, RDB$FIELDS.RDB$FIELD_SCALE FROM RDB$RELATIONS INNER JOIN RDB$RELATION_FIELDS ON (RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME) INNER JOIN RDB$FIELDS ON (RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME) INNER JOIN RDB$TYPES ON (RDB$FIELDS.RDB$FIELD_TYPE = RDB$TYPES.RDB$TYPE) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL ) and (RDB$TYPES.RDB$FIELD_NAME = 'RDB$FIELD_TYPE')) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_POSITION;
Следующий простой запрос покажет количество полей в таблицах.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, count(RDB$RELATION_FIELDS.rdb$field_name) KOL FROM RDB$RELATIONS INNER JOIN RDB$RELATION_FIELDS ON (RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL)) GROUP BY RDB$RELATIONS.RDB$RELATION_NAME ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
А этот запрос, аналогичный предыдущему, выдает количество полей, на которых построены запросы.
SELECT RDB$RELATIONS.RDB$RELATION_NAME, count(RDB$RELATION_FIELDS.rdb$field_name) KOL FROM RDB$RELATIONS INNER JOIN RDB$RELATION_FIELDS ON (RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NOT NULL)) GROUP BY RDB$RELATIONS.RDB$RELATION_NAME ORDER BY RDB$RELATIONS.RDB$RELATION_NAME;
Приведу пример запроса для просмотра прав, выданных в базе данных, пользователям на таблицы. Для этого воспользуемся информацией из таблицы RDB$USER_PRIVILEGES.
Вот краткое пояснение к получившемуся результату: RDB$USER_PRIVILEGES.RDB$USER - кому выдана привилегия, RDB$USER_PRIVILEGES.RDB$GRANTOR - тот, кто выдал привилегию, RDB$USER_PRIVILEGES.RDB$PRIVILEGE - какая привилегия была выдана и было ли выражение WITH GRANT OPTION (RDB$USER_PRIVILEGES.RDB$GRANT_OPTION = 1).
SELECT RDB$RELATIONS.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$USER, RDB$USER_PRIVILEGES.RDB$GRANTOR, RDB$USER_PRIVILEGES.RDB$PRIVILEGE, RDB$USER_PRIVILEGES.RDB$GRANT_OPTION FROM RDB$RELATIONS INNER JOIN RDB$USER_PRIVILEGES ON (RDB$RELATIONS.RDB$RELATION_NAME = RDB$USER_PRIVILEGES.RDB$RELATION_NAME) WHERE ((RDB$RELATIONS.RDB$SYSTEM_FLAG = 0) and (RDB$RELATIONS.RDB$VIEW_SOURCE IS NULL)) ORDER BY RDB$RELATIONS.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$PRIVILEGE;
При RDB$RELATIONS.RDB$VIEW_SOURCE IS NOT NULL можно узнать привилегии для представлений.