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

       

Сервер MSSQL и ODBC



Сервер MS-SQL и ODBC

Наконец, вот код для получения той же информации с сервера MS-SQL через ODBC. Заметьте, что применяемый синтаксис SQL практически идентичен предыдущему примеру благодаря связи Sybase/MS-SQL. Интересны отличия между этим примером и предыдущим:

  • Использование DSN, которое предоставляет нам контекст базы данных по умолчанию, так что нет необходимости указывать, где искать таблицу sysdatabases.
  • Употребление $dbh->DropCursor() в качестве грубой аналогии $sth-fi-nish.
  • Неудобный синтаксис, который приходится применять для запуска хранимых процедур. Информацию о хранимых процедурах и других подобных аномалиях ищите на веб-страницах по Win32: : ODBC.

Вот как выглядит программа:

use Win32::ODBC;

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

chomp($user = <STDIN>);

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

$dsn="sysadm"; и имя источника данных, которое мы используем

# ищем доступные DSN, создаем переменную $dsn,



если она еще не существует

die "Невозможно запросить доступные DSN",Win32::ODBC::Error()."\n"

unless (%dsnavail = Win32::ODBC::DataSources());

if (Idefined $dsnavail{$dsn}) {

die "невозможно создать DSN:".Win32::ODBC::Error()."\n"

unless (Win32::ODBC::ConfigDSN(ODBC_ADD_DSN. "SQL Server", ("DSN=$dsn",

"DESCRIPTION=DSN for PeriSysAdm",

"SERVER=mssql.happy.edu". "DATABASE=master",

"NETWORK=DBMSSOCN".

библиотека сокетов TCP/IP ))); }

it

соединение с основной базой данных

$dbh = new Win32: :ODBC("DSN=$dsn;UID=$iJSer:PWD=$pw: "):

die "Невозможно соединиться с DSN $dsn:".Win32:

# ищем базы данных на сервере

if (defined $dbh->Sql(q{SELECT name from sysdatabases})){

die "Невозможно послать запрос к базе данных:" .Win32: :ODBC: Error().

while ($dbh->FetchRow()){

push(@dbs, $doh->0ata("name"));

}

$dbh->DropCursor();

п

ищем пользовательские таблицы в каждой базе данных

foreach $db (@dbs) {

if (defined $dbh->Sql("use $db")){

die "Невозможно изменить базу данных на $db:" .

Win32::ODBC::Error() . "\n"; >

print "---$db---\n"; @tables=(); if (defined $dbh->

Sql(q{SELECT name from sysobjects

WHERE type="U"})){ die "Невозможно запросить таблицы из $db:" .

Win32::ODBC::Error() . "\n"; } while ($dbh->FetchRow()) {

push(@tables,$dbh->Data("name")); > $dbh->DropCursor();

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

foreach Stable (©tables) { print "\t$table\n";

if (defined $dbh->Sql(" {call sp_columns (\'$table\')} ")){

die "Невозможно запросить поля из таблицы Stable:".

Win32::ODBC::Error() . "\n"; >

while ($dbh->FetchRow()) { @cols=();

@cols=$dbh->Data("COLUMN_NAME","TYPE.NAME","PRECISION");

print "\t\t",$cols[0]," [",$cols[1],"(",$cols[2],")]\n";

} $dbh->DropCursor();

}

}

$dbh->Close();

"SQL Server","DSN=$dsn"))



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