Получить метаданные внешних ключей табличного объекта (foreign_key_info)

Назначение
 

Метод foreign_key_info предоставляет информацию о внешних ключах и/или ссылках табличного объекта БД.

Пакет

Package Linter::db

Прототип
$sth = $dbh- >foreign_key_info($pk_catalog, $pk_schema, $pk_table,
                              $fk_catalog, $fk_schema, $fk_table);
Параметр Описание
$pk_catalog  Имя каталога табличных объектов с первичным ключом (cм. метод table_info, параметр не принимает шаблон для поиска)
$pk_schema  Имя схемы табличных объектов с первичным ключом (см. метод table_info, параметр не принимает шаблон для поиска)
$pk_table  Имя табличного объекта с первичным ключом (см. метод table_info, параметр не принимает шаблон для поиска)
$fk_catalog  Имя каталога табличных объектов с внешним ключом (см. метод table_info, параметр не принимает шаблон для поиска)
$fk_schema  Имя схемы табличных объектов с внешним ключом (см. метод table_info, параметр не принимает шаблон для поиска)
$fk_table  Имя табличного объекта с внешним ключом (см. метод table_info, параметр не принимает шаблон для поиска)
Возвращаемые значения
Переменная Описание
$sth Объект Statement Handle

Примечание

Если клиентское приложение выполняется от имени пользователя БД, который не имеет дискретного или мандатного доступа к некоторым объектам БД, то результат не будет содержать инфорацию об этих объектах.

Особенности реализации метода:

  1. если параметры обоих табличных объектов переданы и если в таблице с внешними ключами имеются ссылки на таблицы с первичными ключами, то метод возвращает внешние ключи;

  2. если указаны параметры только таблицы с первичным ключом, то метод возвращает набор первичных ключей указанной таблицы и все внешние ключи, которые ссылаются на нее;

  3. если указаны параметры только таблицы с внешним ключом, то метод возвращает набор внешних ключей указанной таблицы и все первичные ключи, на которые ссылаются внешние ключи.

Запись метаданных о внешних ключах табличного объекта БД представлена в виде массива из следующих элементов:

Имя элемента Значение
PKTABLE_CAT  Пустая строка
PKTABLE_SCHEM  Имя схемы, содержащей таблицу с первичным (уникальным) ключом
PKTABLE_NAME  Имя таблицы с первичным (уникальным) ключом
PKCOLUMN_NAME  Имя столбца, являющегося первичным (уникальным) ключом
FKTABLE_CAT  Пустая строка
FKTABLE_SCHEM  Имя схемы, содержащей таблицу с внешним ключом
FKTABLE_NAME  Имя таблицы с внешним ключом.
FKCOLUMN_NAME  Имя столбца, являющегося внешним ключом
KEY_SEQ  Значение 1
UPDATE_RULE  Действие, выполняемое со значением внешнего ключа, при обновлении первичного ключа, на который ссылается внешний ключ. Возможные действия:
  • CASCADE: 0 (значение внешнего ключа устанавливается равным новому значению первичного ключа);

  • SET NULL: 2 (значению внешнего ключа присваивается NULL-значение);

  • NO ACTION: 3 (обновление первичного ключа запрещается с выдачей соответствующего кода завершения);

  • SET DEFAULT: 4 (внешнему ключу присваивается значение по умолчанию)

DELETE_RULE  Действие, выполняемое со значением внешнего ключа, при удалении первичного ключа, на который ссылается внешний ключ. Возможные действия аналогичны действиям, описанным в UPDATE_RULE
FK_NAME  Имя внешнего ключа
PK_NAME  Имя первичного (уникального) ключа
DEFERRABILITY  Undef
Пример
my $drh = DBI- >install_driver('Linter');
my $dbh = $drh- >connect("", "SYSTEM", "MANAGER8")
or die "Could not connect to database: " . DBI- >errstr;
$dbh- >do("create table TEST_TABLE(int_column int, char_column char(16), pk_col int primary key);");
$dbh- >do("alter table TEST_TABLE add foreign key (pk_col) references TEST_TABLE(pk_col);");
my $sth = $dbh- >foreign_key_info('', 'TEST_TABLE', '', '', '', '');
while (my $data_ref = $sth- >fetchrow_hashref())
{
  print($data_ref- >{PKTABLE_CAT} . "\n");
  print($data_ref- >{PKTABLE_SCHEM} . "\n");
  print($data_ref- >{PKTABLE_NAME} . "\n");
  print($data_ref- >{PKCOLUMN_NAME} . "\n");
  print($data_ref- >{FKTABLE_CAT} . "\n");
  print($data_ref- >{FKTABLE_SCHEM} . "\n");
  print($data_ref- >{FKTABLE_NAME} . "\n");
  print($data_ref- >{FKCOLUMN_NAME} . "\n");
  print($data_ref- >{KEY_SEQ} . "\n");
  print($data_ref- >{UPDATE_RULE} . "\n");
  print($data_ref- >{DELETE_RULE} . "\n");
  print($data_ref- >{FK_RULE} . "\n");
  print($data_ref- >{PK_RULE} . "\n");
  print($data_ref- >{DEFERRABILITY} . "\n");
}
$dbh- >do("drop table TEST_TABLE;");
$sth- >finish();
$dbh- >disconnect();