18c0693f

Использование ODBC Основные шаги



Документирование сервера

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

Чтобы передать всю «прелесть» непереносимой (nonportable) природы администрирования баз данных, приведу пример реализации одной простой задачи для трех различных SQL-серверов с использованием как DBI, так и ODBC. Каждая из этих программ делает одно и то же: выводит список всех баз данных на сервере, их таблицы и структуру каждой таблицы. Эти сценарии можно очень легко расширить для предоставления более подробной информации о каждом объекте. Например, бывает полезно узнать, в каких полях есть значения ti'J.; или NOT NULL. Вывод всех трех программ выглядит одинаково:

— sysad'ii — hosts

i.ame [c:;ar(30)J ipaddr [char(lb)

aliases [char(50)]

owner [char(40)J

dept [char(15)]

bldg [char(10)]

room [char(4)]

manuf [char(10)J

model [char(10)] —hpotter—

customers

cid [char(4)J

cname [varchar(l3)]

city [varchar(20)J

discnt [real(7>] agents

aid [char(3)]

aname [varchar(13)]

city [varchar(20)]

percent [int(10)] products

pid [char(3)]

pname [varchar(13)]

city [varchar(20)]

quantity [int(10)]

price [real(7)] orders

ordno [int(10>]

month [char(3)]

cid [char(4)]

aid [char(3)]

pid [char(3)]

qty [int(K))]

dollars [real(7)

Сервер MySQL и DBI

Вот как выглядит способ получить эту информацию с сервера MySQL с использованием DBI. Существующее в MySQL дополнение команды SHOW очень упрощает эту задачу:

use DBI;

print "Введите имя пользователя: ";

chomp($user = <STDIN>);

print "Введите пароль для $user: chomp($pw = <STDIN>)

Sstart = "mysql"; tf первоначально будем подсоединяться к этой базе данных

О соединяемся с базой данных

$dbh = DBI->connect("DBI:mysql:$start".$user.$pw);

die "Невозможно соединиться: ".$DBI::errstr."\n"

unless (defined $don): ft ищем базы данных на сервере

$sth=$doh->prepartj(q;SHOW DATABASES}) or

die "Невозможно подготовить запрос show dataoaset; ".

die "Невозмохо заполнить запрос

push(@dcs.$a'-e*->[0]): > $sth->finish;

# ищем таблица в каждой базе данных foreach $db (!g>dbs) { print "---$db---\n";

$sth=$dbh->prepare(qq{SHOW TABLES FROM $db}) or

die "Невозможно подготовить запрос

show tables: ". $dbh->t:r rs*

die "Невозможно выполнить запрос show tables: ".

$dbh->crr:

(g>tables=();

while (Saref = $sth->fetchrow_arrayref) {

push(Stables,$aref->[0]); }

$sth->finish;

tt

ищем информацию о полях для каждой таблицы

foreach Stable (^tables) { print "\t$table\n":

$sth=$dbh->prepare(qq[SHOW COLUMNS FROM Stable FROM Sob!) o'

die "Невозможно подготовить запрос show columns: ". $cihh-^errstr."\n";

$sth->execute or die "Невозможно выполнить запрос show columns: ".

while (Saref = $sth->fetchrow_arrayref) {

print "\tAt".Saref->[0]." [". $aref->[1 ]. "]\n":

$stn->finisn \ I

} Sdbr->d;.scor/iec::

Добавим несколько комментариев к приведенной программе:





Все публикации раздела