Страница 29 из 38 Системные таблицы Общие замечания Это далеко не полный список таблиц и их полей. Все имена, хранимые в базе, обычно хранятся в формате 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. |