Perl для системного администрирования

Использование ODBC


Основные шаги при использовании ODBC похожи на только что рассмотренные действия с DBI.

Шаг 1: Загрузите нужный модуль Perl

use Win32::ODBC;

Шаг 2: Соединитесь с базой данных и получите дескриптор соединения

Перед тем как установить соединение в ODBC, следует выполнить один дополнительный шаг. Нужно создать имя источника данных (Data Source Name, DSN). DSN - это именованная ссылка, в которой хранится конфигурационная информация (например, имя сервера и базы данных), необходимая для доступа к источнику информации, такому как SQL-сервер. Имена источников данных бывают двух типов:

пользовательские (user) и системные (system), различающиеся тем, будет ли соединение доступно одному пользователю на машине либо любому пользователю или службе.

DSN можно создать либо из панели управления ODBC в Windows NT/2000, либо программным образом из Perl. Мы пойдем вторым путем, хотя бы для того, чтобы не вызывать насмешек со стороны пользователей Unix. Вот как можно поступить для создания пользовательского имени источника данных на сервере MS-SQL:

и создаем пользовательское имя источника данных на Microsoft-SQL-сервере

# Замечание: чтобы создать системное имя источника данных,

 замените ODBC_ADD_DSN на ODBC_ADD_SYS,DSN

if (Win32::ODBC::ConfigDSN(

ODBC_ADD_DSN,

"SOL Server",



("DSN=PerlSysAdfr-", "DESCRIPTION=DSN for PerlSysAdm"

"SERVER=mssql.happy.edu".

 имя сервера

"ADDRESS=192.168, 1. 4".

it IP-адрес сервера

"DATABASE=sysadm",

"NETWORK=DBMSSOCN".

print "DSN создам--} else {

После того как имя источника данных создано, его можно использовать для открытия соединения с базой данных:

соединяемся с DSN, возвращаем дескриптор базы данных

$dbh=new Win32::ODBC("DSN=PeriSysAdm;UID=$username; PWD=$pw; ");

die "Невозможно соединиться с DSN PerlSysAdm:" . Win32::ODBC::Erroi() "\n"

unless (defined $dbh);

Шаг З: Отправьте команды SQL на сервер

ODBC-эквивалент DBI-командам do(), prepare() и execute() немного проще, потому что модуль Win32: :ODBC имеет один метод Sql() для отправки команды на сервер. Хотя в ODBC теоретически упоминается о подготовке команды и заполнителях, это не реализовано в текущей версии модуля Win32: : ODBC. В Win32: : ODBC также не используются дескрипторы команд; взаимодействие происходит через дескриптор базы данных, открытый ранее при помощи метода new. Так что нам остается команда с простейшей структурой:




$rc = $dbh->Sql(q{SELECT « from hosts});

Есть разница между методами ODBC и DBI: в отличие от do() из DBI, Sql() возвращает undef, если запрос был завершен успешно, и некоторое ненулевое значение, если запрос не был выполнен.

Если необходимо узнать, сколько записей было обработано в результате запроса INSERT, DELETE или UPDATE, следует использовать метод RowCount(). В документации по Win32: :ODBC сказано, что этот вызов реализован не во всех драйверах ODBC (либо реализован не для всех операторов SQL), поэтому не стоит слепо полагаться на драйвер, лучше сначала все проверить. Как и в случае с методом ехе из DBI, RowCount() вернет 1, если драйверу недоступна информация о количестве полученных записей.

Шаг 4: Получите результаты запроса SELECT

Получение результатов запроса SELECT для ODBC выполняется подобно тому, как это было сделано для DBI, но с одним отличием. Во-первых, получение

данных с сервера и обращение к ним являются двумя разными шагами в Win32: : ODBC. Метод FetchRow() получает следующую запись, возвращает 1, если все прошло успешно, и undef, если что-то было не так. Когда запись получена, можно выбрать один из двух методов, чтобы обратиться к ней.

Метод Data() возвращает список полученных полей, если вызывается в списочном контексте, и все поля, склеенные вместе, если вызывается в скалярном контексте. Data() может принимать в качестве необязательного аргумента список, определяющий, какие поля возвращать и в каком порядке (иначе, в соответствии с документацией, они возвращаются в «неопределенном» порядке).

Метод DataHash() возвращает хэш, ключами которого являются имена полей. Это очень похоже на DBI-метод fetchrow_hashref(), с тем исключением, что он возвращает хэш, а не ссылку на хэш. Как и Data(), DataHash() тоже может принимать список в качестве необязательного аргумента для определения того, какие поля возвращать.

В нашем случае эти методы выглядят так:

if ($dbh->FetchRow()){

@ar = $dbh->Data();

сделать-что-то-со-значениями @ar }



и:

if ($dbh->FetchRQw()){

%ha = $doh->DataHash('name', 'ipaddr' ):

сделать-что-то-со-значемям-$Ьа1пате}

Справедливости ради надо отметить, что информацию, передаваемую через атрибут дескриптора команды {NAME} в DBI, в мире Wi'i3? : : ODBC можно получить. Для того чтобы узнать количество полей (как в {NUM_OF_F-ItLDS}), придется пересчитать элементы в списке, возвращенном методом Р- Lelcifb).

Шаг 5: Закройте соединение с сервером

$dbh->close(;

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

# замените ODBC_REMOVE_DSN на ODBC_REMOVE_SYS_DSN, если

создавали системное имя источника данных

if (Win32::ODBC::ConfigDSN(ODBC_REMOVE_DSN

"SQL Server", "DSN=PKriSysAdni')){

print "DSN удален\п"; } else {

die "Невозможно удалить DSN:".Win32::ODBC::Error()."\n"; }

Теперь известно, как работать с базами данных из Perl, используя DBI и ODBC. Применим эти знания на практике и поработаем с более сложными примерами из области администрирования баз данных.






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