Содержание |
В статье пойдет речь о нескольких способах подключения к базам данных MS SQL Server из Perl на виртуальном UNIX-хостинге 1Gb.ru При этом вы должны уметь подлючаться к серверу по SSH и самостоятельно устанавливать различные модули Perl. Собственно, статья объясняет не только создание подключения из Perl, а в большей степени обращение к MS SQL Server из операционной системы UNIX в целом.
ODBC - это всего лишь программный интерфейс, который призван был унифицировать и в том числе облегчить различным программам (из различных операционных систем) обмен информацией с базами данных. Сам по себе ODBC интерфейс ничего не знает о том, какой порт используется, какой протокол при обращении к той или иной базе, этим занимается исключительно драйвер, который имеет поддержку ODBC и описан в его настройках.
В UNIX системах имеется несколько реализаций ODBC, наиболее популярные реализации unixODBC и iODBC. unixODBC обычно установлен на серверах хостинга, однако если его нет, то вы можете его поставить самостоятельно в свой домашний каталог, либо обратитесь к поддерже.
Проверяется наличие ODBC так:
$ odbc_config --version
Также существует и несколько драйверов с поддержой ODBC для работы с MS SQL Server, есть платные, есть и бесплатные. Лучшим бесплатным драйвером для UNIX'а уже давно принято считать FreeTDS (установлен по-умолчанию на всех серверах хостинга 1Gb.ru). Именно на его основе и пойдет дальнейшее изложение настройки подключения.
/etc
или еще где.
echo 'export ODBCSYSINI=$HOME' >> ~/.bashrc echo 'export ODBCINI=$HOME/.odbc.ini' >> ~/.bashrc source ~/.bashrc
tds.driver.tmpl
) примерно такого содержания:
[FreeTDS] Description = FreeTDS driver (MS SQL) Driver = /usr/lib/libtdsodbc.so
[FreeTDS]
- это просто имя для драйвера, можете придумать что-то свое
Description
- описание, может быть любым; исключительно для удобства;
Driver
- важная строка, содержит полный путь к драйверу;
Сгенерируем файл описания драйвера на основе нашего шаблона:
odbcinst -i -d -f tds.driver.tmpl
-i
- записать сведения о драйвере в odbcinst.ini
;
-d
- сведения должны быть о драйвере;
-f
- использовать файл шаблона;
В случае успешной установки, команда напишет следующее:
odbcinst: Driver installed. Usage count increased to 1. Target directory is /home/virtwww/...
Также появится файл odbcinst.ini
$ cat ~/odbcinst.ini [FreeTDS] Description=FreeTDS driver (MS SQL) Driver=/usr/lib/libtdsodbc.so UsageCount=1
DSN
.
Аналогично делаем файл шаблона tds.dsn.tmpl
, его содержимое:
[MSSQL] Driver = FreeTDS Description = ODBC via FreeTDS Trace = No Server = ms-sql-4.in-solve.ru Port = 1433 Database = 1gb_dmih222
[MSSQL]
- название соединения, может быть все что угодно, именно это имя будет затем использоваться для установления соединения;
Description
- описание, может быть любым; исключительно для удобства;
Driver
- важное поле, это название драйвера, который мы описали в файле odbcinst.ini
Генерируем файл .odbc.ini
:
$ odbcinst -i -s -f tds.dsn.tmpl
-s
- сведения должны быть о соединении;
Команда не выводит никакой информации, однако, успешным результатом ее работы будет создание файла ~/.odbc.ini
$ cat ~/.odbc.ini [MSSQL] Driver=FreeTDS Description=ODBC via FreeTDS Trace=No Server=ms-sql-4.in-solve.ru Port=1433 Database=1gb_dmih222
$ rm ~/tds.driver.tmpl; rm ~/tds.dsn.tmpl
isql
isql -v MSSQL логин пароль
MSSQL
- имя подключения;
логин
- логин к базе данных;
пароль
- пароль к базе данных;
В случае успешного подключения, вы увидите примерно следующее:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
можно какой-нибудь и SQL-запрос туда написать ;)
$ perl -e 'use DBI;' $ perl -e 'use DBD::ODBC;'
если модуля нет, то поставьте его.
Примечание. Посмотреть список всех модулей поддерживающих интерфейс DBI можно так:
$ perl -MDBI -e 'DBI->installed_versions;'
Если все модули на месте или их установка прошла успешно, то можно переходить к тестированию.
Создадим простой скрипт mssql_connect.pl
:
#!/usr/bin/perl -w use strict; use DBI; $ENV{'ODBCSYSINI'} = "$ENV{'HOME'}"; $ENV{'ODBCINI'} = "$ENV{'HOME'}/.odbc.ini"; my $data_source = q/dbi:ODBC:имя_подключения/; my $user = q/логин/; my $password = q/пароль/; my $dbh = DBI->connect($data_source, $user, $password) or die "Can't connect to $data_source: $DBI::errstr"; print "Connecting to the database was successful\n" if ($dbh); $dbh->disconnect;
имя_подключения
- имя из квадратных скобок из файла ~/.odbc.ini, т.е. в нашем примере это MSSQL;
и сама проверка:
$ perl mssql_connect.pl Connecting to the database was successful
Как правило, это обращение к драйверу и использование его возможностей напрямую, без каких-либо иных высокоуровневых интерфейсов. В используемом нами драйвере FreeTDS существует поддержка открыторго API CTLIB, разработанного компанией Sybase, его мы и будем использовать.
В Perl интерфейс CTLIB реализован в модуле DBD::Sybase
$ perl -e 'use DBI;' $ perl -e 'use DBD::Sybase;'
если нет, то поставим их.
Для того, чтобы поставить модуль DBD::Sybase, мы должны сообщить, где расположен драйвер:
$ echo 'export SYBASE=/usr' >> ~/.bashrc $ source ~/.bashrc
и далее уже ставим модуль, либо через CPAN, либо используя Makefile, кому как удобнее.
Примечание 1. Так как используется общесистемный драйвер, расположенный по стандартному пути, то делать это не обязательно. Однако не забудьте добавить правильный путь, если вы используете свой драйвер, установленный в домашний каталог.
Примечание 2. Если вы ставите модуль через CPAN-шелл, то используйте команду force install DBD::Sybase
, дабы избежать ненужных тестов.
~/.freetds.conf
опишем наше подключение:
[MYMSSQL] host = ms-sql-4.in-solve.ru port = 1433
[MYMSSQL]
- это имя, которое мы будем использовать в скриптах при подключении к серверу;
mssql_connect2.pl
с таким содержимым:
#!/usr/bin/perl -w use strict; use DBI; $ENV{'SYBASE'} = "/usr"; my $data_source = q/dbi:Sybase:MYMSSQL/; my $user = q/логин/; my $password = q/пароль/; my $dbh = DBI->connect($data_source, $user, $password) or die "Can't connect to $data_source: $DBI::errstr"; print "Connecting to the database was successful\n" if ($dbh); $dbh->disconnect;
MYMSSQL
- это имя подключения из файла ~/.freetds.conf
$ perl mssql_connect2.pl Connecting to the database was successful