InterBase: тормозология и глюконавтика
Страница 29. Системные таблицы


Системные таблицы

Общие замечания

Это далеко не полный список таблиц и их полей.

Все имена, хранимые в базе, обычно хранятся в формате CHAR(31), так что значения оказываются дополненными пробелами до этой длинны. Буквы приводятся к верхнему регистру. Так что если со стороны программы приходит имя в обычном виде, то сравнивать можно примерно так: rdb$чего-то like upper(имя||'%'). Хотя иногда это опасно - может попасться другая таблица, у которой начало имени соответствует заданному.

Многие поля хранят такую штуку, как BLR. Это, по всей видимости, такой своеобразный промежуточный код, который возникает в результате компиляции различных объектов (процедур, триггеров, представлений, вычисляемых полей, и т. п.) и затем в нужные моменты исполняется ядром interbase.

Надо сказать, что многие из данных таблиц могут оказывать радикальное действие на соответствующие операции. В частности, при открытии таблиц BDE обожает вычитывать метаданные по полям. При этом далеко не все из этих таблиц надлежащим образом проиндексированы. Так, производительность оператора revoke может подскочить в отдельных случаях более чем на порядок, если проиндексировать RDB$USER_PRIVILEGES. Таким образом, если Вас не устравивает скорость, посмотрите SQL-монитором, к каким таблицам идёт обращение и если на соответствующих полях нет индексов - создайте.

Только следует учитывать одну неприятность - эти индексы проживут только до следующего резервного копирования. Дело в том, что при восстановлении базы системные таблицы целиком генерируются, в бэкапе (полной) информации по их структуре нет. Так что индексы на них будут потеряны.

Кроме этого, иногда удаётся выправить метаданные, чтобы реализовать то, что не поддерживается официально, через create/alter/drop. Правда, никаких гарантий, но всё же ... У этой операции одна особенность: изменения вступают в силу только в момент фиксации транзакции. То есть commit будет долгим и может легко привести к сбою.

И так:

RDB$CHARACTER_SETS - кодировки символов.

RDB$CHARACTER_SET_NAME - имя кодировки. Может употребляться в конструкциях SQL без кавычек.
RDB$FORM_OF_USE - что-то зарезервированное, во всех системных кодировках - null.
RDB$NUMBER_OF_CHARACTERS - количество символов в кодировке, во всех системных кодировках - null.
RDB$DEFAULT_COLLATE_NAME - имя сравнения по умолчанию. Сравнения описываются в RDB$COLLATIONS.
RDB$CHARACTER_SET_ID - имя уникальный номер кодировки. Некоторые системные таблицы ссылаются на кодировку по нему.
RDB$SYSTEM_FLAG - признак того, что это системная кодировка (1), а не введённая пользователем (0). Как вводить пользовательские - неизвестно.
RDB$DESCRIPTION - текстовое описание, комментарий. У всех системных - null.
RDB$FUNCTION_NAME - нечто зарезервированное. У всех системных - null.
RDB$BYTES_PER_CHARACTER - количество байт на символ. У большинства кодировок - 1, у некоторых азиатских - 2, а у Unicode, как ни странно, 3.
RDB$CHECK_CONSTRAINTS - ограничения целостности. Исключая ссылочные и ключевые.
RDB$CONSTRAINT_NAME - имя самого ограничения. Безымянные обзываются в формате INTEG_nnn.
RDB$TRIGGER_NAME - имя ... то ли триггера, то ли поля. То есть для ограничений типа not null это имя поля (без привязки к таблице), а для остальных - имя системного триггера (CHECK_nnn), сгенерированного для контроля соотеветствующего ограничения.
RDB$COLLATIONS - сравнения символов.
RDB$COLLATION_NAME - название сравнения.
RDB$COLLATION_ID - номер сравнения, видимо, в пределах кодировки потому что много совпадающих.
RDB$CHARACTER_SET_ID - номер кодировки (RDB$CHARACTER_SETS. RDB$CHARACTER_SET_ID), в рамках которой работает данной сравнение.
RDB$COLLATION_ATTRinterbaseUTES - какие-то зарезервированные атрибуты. У всех стандартных - null.
RDB$SYSTEM_FLAG - признак системности (0 - пользовательское, не 0 - системное). У всех стандартных = 1.
RDB$DESCRIPTION - комментарий. У всех стандартных - null.
RDB$FUNCTION_NAME - что-то зарезервированное. У всех стандартных - null.
RDB$DATABASE - глобальные параметры базы данных. В этой таблице в нормальных условиях должна быть только одна запись.
RDB$DESCRIPTION - комментарий к базе. Обычно null.
RDB$RELATION_ID - какой-то зарезервированный номер отношения. Есть подозрение, что это номер поколения структуры базы. К RDB$RELATIONS отношения, видимо, не имеет.
RDB$SECURITY_CLASS - имя класса безопасности согласно RDB$SECURITY_CLASSES. Если установлено, то применяется ко всем объектам в базе. Обычно - null, то есть никаких дополнительных ограничений.
RDB$CHARACTER_SET_NAME - кодировка по умолчанию для базы согласно RDB$CHARACTER_SETS.
RDB$DEPENDENCIES - зависимости между объектами БД. Ну очень полезная таблица, но иногда вручая - не все зависимости бывают видны. Даже апосле перебэкапа.
RDB$DEPENDENT_NAME - что зависит.
RDB$DEPENDED_ON_NAME - от чего зависит.
RDB$FIELD_NAME - на случай, если предыдущее поле - отношение, от какого поля зависит. Если от объекта вообще, то null.
RDB$DEPENDENT_TYPE - тип того, что зависит.
RDB$DEPENDENT_ON_TYPE - того, от чего зависит.

Типы зависимых и зависящих объектов кодируются числами:
0 - таблица
1 - представление
2 - триггер
3 - вычисляемое поле
4 - проверка (что за зверь?)
5 - процедура
6 - индекс по выражению (хотя вообще-то такие вещи в нынешнем interbase не поддерживаются)
7 - исключение
8 - пользователь (интересно, это как?)
9 - поле
10 - индекс (никому не посоветую такую зависимость, будут глюки с бэкапом)
Подобности для конкретной БД можно извлечь из RDB$TYPES.

 
« Предыдущая статья