Заметки о системных таблицах InterBase

Ограничения.


Поговорим немного об ограничениях, которые Вы накладываете на таблицы, что бы они удовлетворяли условиям ссылочной целостности или содержали в полях значения, удовлетворяющие определенным правилам. Одно такое ограничение уже упоминалось. Это поле rdb$null_flag из таблицы rdb$relation_fields, которое информирует Вас о том, может ли столбец таблицы содержать значение NULL.

select RDB$CONSTRAINT_NAME, RDB$CONSTRAINT_TYPE, RDB$INDEX_NAME from rdb$relation_constraints where rdb$relation_name = quot;EMPLOYEE";

Этот запрос возвращает информацию почти обо всех ограничениях, наложенных на таблицу. Поле RDB$CONSTRAINT_NAME - это имя ограничения. RDB$INDEX_NAME - имя индекса для ограничений типа UNIQUE, PRIMARY KEY и FOREIGN KEY. Достаточно легко получить список ограничений определенного типа, например:

SELECT RDB$CONSTRAINT_NAME FROM RDB$RELATION_CONSTRAINTS WHERE (RDB$RELATION_NAME = "EMPLOYEE") and (rdb$constraint_type = "CHECK");

Этот запрос выдает список имен CHECK ограничений. Рассмотрим подробнее каждый тип ограничения.

CHECK ограничения базируются на триггерах. Эти триггеры создаются InterBase сервером автоматически при создании соответствующего CHECK ограничения. Однако можно посмотреть, какие триггеры работают при обработке ограничения.

select rdb$trigger_name from rdb$check_constraints where rdb$constraint_name = "INTEG_30";

В условии отбора указывается имя ограничения, полученное предыдущим SQL запросом. Нужно заметить, что для ограничений этого типа создается два триггера типа BEFORE INSERT и BEFORE UPDATE.

О том, как получить информацию о триггерах, мы поговорим ниже.

Ограничения типа UNIQUE, PRIMARY KEY и FOREIGN KEY базируются на индексах, которые также создаются InterBase сервером автоматически. Можно получить список имен ограничений и соответствующие имена индексов следующим запросом:

SELECT RDB$CONSTRAINT_NAME, RDB$INDEX_NAME FROM RDB$RELATION_CONSTRAINTS WHERE (RDB$RELATION_NAME = "EMPLOYEE") AND (RDB$CONSTRAINT_TYPE = "FOREIGN KEY");


Имея имя индекса, можно просмотреть на базе каких полей построен этот индекс, активен ли он и т.д. Об этом мы поговорим чуть позже.

Индексы FOREIGN KEY поддерживают ссылочную целостность между таблицами в базе данных. При помощи их устанавливается связь, и им соответствуют индексы PRIMARY KEY. Среди служебных таблиц базы данных есть таблица, которая связывает пары FOREIGN KEY и PRIMARY KEY. Это RDB$INDICES. Учитывая все это можно определить, с какой таблицей связана данная таблица по выбранному индексу FOREIGN KEY. Следующий SQL возвращает имя таблицы и индекс PRIMARY KEY, с которым осуществляет связь индекс FOREIGN KEY. В данном случае это RDB$FOREIGN9.

select rdb$relation_name , rdb$index_name from rdb$indices where rdb$index_name in (select rdb$foreign_key from rdb$indices where rdb$index_name = "RDB$FOREIGN9");

Учитывая, что таблица RDB$REF_CONSTRAINTS содержит список всех вторичных ключей с поставленными в соответствие первичными ключами, то можно попробовать определить пары таблиц master-detail.

SELECT a.RDB$RELATION_NAME,a.RDB$INDEX_NAME, c.RDB$RELATION_NAME, c.RDB$INDEX_NAME FROM RDB$RELATION_CONSTRAINTS a, RDB$REF_CONSTRAINTS b, RDB$RELATION_CONSTRAINTS c WHERE (a.RDB$CONSTRAINT_NAME = b.RDB$CONSTRAINT_NAME) and (b.RDB$CONST_NAME_UQ = c.RDB$CONSTRAINT_NAME) order by a.RDB$RELATION_NAME;

Этот SQL-запрос, кроме пар таблиц master-detail, возвращает и имена соответствующих индексов PRIMARY KEY и FOREIGN KEY. Эти поля можно убрать и тогда Вы получите просто таблицу связей между таблицами.


Содержание раздела