Perl没有密码的ODBC连接
我想让我的Perl脚本使用ODBC连接字符串连接到数据库。这适用于下面的代码。但我也希望它使用我已经输入到ODBC连接的用户名和密码。我不想在脚本中提供这些内容。Perl没有密码的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";
}
注意:DB必须设置密码(消隐pwd不是选项)。
操作系统是Windows 2008 R2(64位)。 ODBC连接在系统DSN中定义为32位。 Perl版本是32位。连接已完成到MSSQL 2008 R2。
您需要认识到,由于历史原因,如果连接字符串不包含DSN =,DBD :: ODBC会尝试在SQLDriverConnect之前调用SQLConnect。 ODBC调用SQLConnect需要3个参数dsn名称,用户名和密码。从ODBC文档中不清楚是否传递NULL(用C表示)用户名和密码意味着它们不被使用或不被使用。但是,如果您将DBI连接第一个参数指定为dbi:ODBC:DSN = mydsn并省略用于连接的用户名/密码参数(或将它们作为undef传递)DBD :: ODBC调用SQLDriverConnect并且ODBC驱动程序可以从其他DSN详细信息你的DSN。然而,我没有尝试过这一点,我略微担心DBD :: ODBC中的SQLDriverConnect调用传递SQL_DRIVER_NOPROMPT作为唯一参数,并且不包含SQL_DRIVER_COMPLETE。如果您尝试上述操作并且无法正常工作,请尝试将对SQLDriverConnect的调用更改为SQL_DRIVER_NOPROMPT | SQL_DRIVER_COMPLETE并重新编译DBD :: ODBC。如果它们在rt.cpan.org上运行RT,或者在这里回答,我会考虑改变它。
UPDATE 4-Nov-11在1.32_2 dev版本中,我在DBD :: ODBC中添加了odbc_driver_complete属性。我并不是建议它修复OP的任何问题,但它增加了新功能。
我试过没有undef,也没有运气。那么这是我们现在最接近的答案。这是一个小小的任务,所以不能花太多时间。 –
我不明白“我也试过没有undef”。这是一种遗憾,你没有尝试使用dbi:ODBC:DSN = mydsn,并且没有用户名/密码,因为我不知道在DBD :: ODBC中添加SQL_DRIVER_COMPLETE是否有用。 – bohica
您希望传入的用户名和密码如何?
这是一个命令行版本。
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}"
));
它使用在控制面板中的ODBC连接中输入的用户名/密码(因此密码不是以明文形式存储的)。 –
假设你使用的是Windows,你可以使用Win32 :: ODBC模块。
use Win32::ODBC;
my $dbh = new Win32::ODBC("odbc_connection_name");
if ($dbh)
{
print "OK\n";
} else {
print "FAIL\n";
}
没有骰子。 ODBC跟踪日志显示“用户登录失败”。用户未与可信的SQL Server连接相关联。 (18452)'。 –
它在Windows 7机器上使用System DSN ODBC连接来连接到本地SQL Server 2008 R2数据库。连接使用SQL Server身份验证,并使用保存在ODBC中的用户名和密码。您是否能够使用其他程序在没有用户名/密码的情况下使用ODBC连接? – Narthring
尝试仅使用第一个参数,并且不为user/passwd使用'undef,undef'。 The DBD::ODBC FAQ似乎表明您不需要其他两个参数。
同样的结果。如果你需要第四个参数,undef只是一个placefiller。当没有用户/ pwd给出时,假设db没有登录要求,如果我正确阅读手册。 –
你连接了哪个数据库? –
该数据库是MSSQL 2008 –