Perl ODBC соединение без пароля - PullRequest
1 голос
/ 06 сентября 2011

Я хочу, чтобы мой сценарий Perl использовал строку подключения ODBC для подключения к БД. Это прекрасно работает с кодом ниже. Но я также хочу, чтобы он использовал имя пользователя + пароль, которые я ввел в соединение ODBC. Я не хочу поставлять их из сценария.

Кто-нибудь знает, как этого добиться?

use DBI;

my $strConn = "dbi:ODBC:MyDB";
my $username = "username";
my $password = "password";

# Does work
$dbh = DBI->connect( $strConn, $username, $password, { PrintError => 1, RaiseError => 1 } );

# Does not work
#$dbh = DBI->connect( $strConn, undef, undef, { PrintError => 1, RaiseError => 1 } );

if ($dbh)
{
   print "OK\n";
} else {
   print "FAIL\n";
}

Примечание: в БД должен быть установлен пароль (пробел не доступен).

Операционная система - Windows 2008 R2 (64-разрядная). Соединение ODBC определяется в System DSN как 32-разрядное. Perl-версия 32-битная. Соединение выполнено с MSSQL 2008 R2.

Ответы [ 4 ]

1 голос
/ 06 сентября 2011

Если вы используете Windows, вы можете использовать модуль Win32 :: ODBC.

use Win32::ODBC;

my $dbh = new Win32::ODBC("odbc_connection_name");    

if ($dbh)
{
   print "OK\n";
} else {
   print "FAIL\n";
}
0 голосов
/ 07 сентября 2011

Необходимо понимать, что по историческим причинам DBD :: ODBC пытается вызвать SQLConnect перед SQLDriverConnect, если строка подключения НЕ включает DSN =.Вызов ODBC SQLConnect принимает 3 аргумента dsn name, username и password.Из документации ODBC не ясно, означает ли передача NULL (в C) для имени пользователя и пароля, что они не должны использоваться или нет.Однако, если вы укажете свой первый аргумент подключения DBI как dbi: ODBC: DSN = mydsn и пропустите аргументы имени пользователя / пароля для подключения (или передадите их как undef), DBD :: ODBC вызывает SQLDriverConnect, а драйвер ODBC может найти другие сведения о DSN изваш DSN.Тем не менее, я не пробовал это, и я немного обеспокоен, что вызов SQLDriverConnect в DBD :: ODBC передает SQL_DRIVER_NOPROMPT в качестве единственного аргумента и не включает SQL_DRIVER_COMPLETE.Если вы попробуете описанное выше, но это не сработает, попробуйте изменить вызов SQLDriverConnect на SQL_DRIVER_NOPROMPT | SQL_DRIVER_COMPLETE и перекомпилировать DBD :: ODBC.Если это сработает, верните его на rt.cpan.org или ответьте здесь, и я посмотрю, как его изменить.

ОБНОВЛЕНИЕ 4-ноя-11 Я добавил атрибут odbc_driver_complete в DBD :: ODBC в 1.32_2 devрелиз.Я не предполагаю, что это исправляет любую проблему, которую имел OP, но это добавляет новую функциональность.

0 голосов
/ 07 сентября 2011

Попробуйте только с первым аргументом и без 'undef, undef' для пользователя / passwd. Часто задаваемые вопросы DBD :: ODBC , кажется, указывают, что вам не нужны другие два аргумента.

0 голосов
/ 06 сентября 2011

Как бы вы предпочли передать имя пользователя и пароль?

Вот версия для командной строки.

use 5.010;
use strict;
use warnings;
use Getopt::Long qw<GetOptions>;

GetOptions( \my %options, qw<user|u password|pwd|p> );
# Non-option arguments will be left on @ARGV
# this script also accepts script.pl [USER] [PASSWORD]
usage( 'User not set!' )     unless ( $options{user} //= shift );
usage( 'Password not set!' ) unless ( $options{password} //= shift );

$dbh 
    = DBI->connect( 
      $strConn
    , @options{ qw<user password> }
    , { PrintError => 1, RaiseError => 1 } 
    );

Или

$dbh
    = DBI->connect( join( 
      ';'
    , 'DBI:ODBC:driver={SQL Server}'
    , "Server=$SQL_SERVER"
    , "Database=$SQL_DATABASE"
    , "UID=$option{user}"
    , "PWD=$option{password}"
    ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...