Получить метаданные внешних ключей табличного объекта (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 |
Примечание
Если клиентское приложение выполняется от имени пользователя БД, который не имеет дискретного или мандатного доступа к некоторым объектам БД, то результат не будет содержать инфорацию об этих объектах.
Особенности реализации метода:
-
если параметры обоих табличных объектов переданы и если в таблице с внешними ключами имеются ссылки на таблицы с первичными ключами, то метод возвращает внешние ключи;
-
если указаны параметры только таблицы с первичным ключом, то метод возвращает набор первичных ключей указанной таблицы и все внешние ключи, которые ссылаются на нее;
-
если указаны параметры только таблицы с внешним ключом, то метод возвращает набор внешних ключей указанной таблицы и все первичные ключи, на которые ссылаются внешние ключи.
Запись метаданных о внешних ключах табличного объекта БД представлена в виде массива из следующих элементов:
| Имя элемента | Значение | |
|---|---|---|
PKTABLE_CAT
| Пустая строка | |
PKTABLE_SCHEM
| Имя схемы, содержащей таблицу с первичным (уникальным) ключом | |
PKTABLE_NAME
| Имя таблицы с первичным (уникальным) ключом | |
PKCOLUMN_NAME
| Имя столбца, являющегося первичным (уникальным) ключом | |
FKTABLE_CAT
| Пустая строка | |
FKTABLE_SCHEM
| Имя схемы, содержащей таблицу с внешним ключом | |
FKTABLE_NAME
| Имя таблицы с внешним ключом. | |
FKCOLUMN_NAME
| Имя столбца, являющегося внешним ключом | |
KEY_SEQ
| Значение 1 | |
UPDATE_RULE
| Действие, выполняемое со значением внешнего ключа, при обновлении первичного ключа, на который ссылается внешний ключ. Возможные действия:
| |
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();