Сервер 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"))