【问题标题】:Perl ODBC connection without passwordPerl ODBC 连接无密码
【发布时间】:2011-09-06 14:09:13
【问题描述】:

我希望我的 Perl 脚本使用 ODBC 连接字符串连接到 DB。这适用于下面的代码。但我也希望它使用我在 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 必须设置密码(不能选择空白密码)。

操作系统为 Windows 2008 R2(64 位)。 ODBC 连接在 System DSN 中定义为 32 位。 Perl 版本是 32 位的。连接到 MSSQL 2008 R2。

【问题讨论】:

  • 你连接的是什么数据库?

标签: database perl odbc connection-string


【解决方案1】:

假设您使用的是 Windows,您可以使用 Win32::ODBC 模块。

use Win32::ODBC;

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

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

【讨论】:

  • 没有骰子。 ODBC 跟踪日志显示 Login failed for user ''. The user is not associated with a trusted SQL Server connection. (18452)
  • 它在 Windows 7 机器上使用系统 DSN ODBC 连接来连接到本地 SQL Server 2008 R2 数据库对我有用。连接使用 SQL Server 身份验证,用户名和密码保存在 ODBC 中。您是否可以让任何其他程序在没有用户名/密码的情况下使用 ODBC 连接?
【解决方案2】:

您需要意识到,如果连接字符串不包含 DSN=,则由于历史原因 DBD::ODBC 会尝试在 SQLDriverConnect 之前调用 SQLConnect。 ODBC 调用 SQLConnect 采用 3 个参数 dsn 名称、用户名和密码。从 ODBC 文档中不清楚是否为用户名和密码传递 NULL(在 C 中)意味着不使用它们。但是,如果您将 DBI 连接第一个参数指定为 dbi:ODBC:DSN=mydsn 并省略用户名/密码参数以进行连接(或将它们作为 undef 传递) DBD::ODBC 调用 SQLDriverConnect 并且 ODBC 驱动程序可以从你的 DSN。但是,我没有尝试过这个,我有点担心在 DBD::ODBC 中对 SQLDriverConnect 的调用将 SQL_DRIVER_NOPROMPT 作为唯一参数传递,并且不包括 SQL_DRIVER_COMPLETE。如果您尝试上述方法但不起作用,请尝试将 SQLDriverConnect 调用更改为 SQL_DRIVER_NOPROMPT|SQL_DRIVER_COMPLETE 并重新编译 DBD::ODBC。如果他们可以在 rt.cpan.org 上 RT 或在此处回答,我会考虑更改它。

2011 年 11 月 4 日更新我在 1.32_2 开发版本中向 DBD::ODBC 添加了一个 odbc_driver_complete 属性。我并不是建议它修复 OP 的任何问题,但它增加了新功能。

【讨论】:

  • 我也试过不使用undef,但没有运气。所以这是我们目前最接近答案的地方。这是一个小任务,所以不能花太多时间。
  • 我不明白“我也尝试过不使用 undef”。很遗憾您没有尝试使用 dbi:ODBC:DSN=mydsn 并且没有用户名/密码,因为这会给我一个关于添加 SQL_DRIVER_COMPLETE 在 DBD::ODBC 中是否有用的指针。
【解决方案3】:

您希望如何输入用户名和密码?

这是一个命令行版本。

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 连接的用户名/密码的全部意义(因此密码不以明文形式存储)。
【解决方案4】:

尝试只使用第一个参数而不是用户/密码的'undef,undef'。 The DBD::ODBC FAQ 似乎表明您不需要其他两个参数。

【讨论】:

  • 同样的结果。如果您需要第四个参数,undef 只是一个占位符。当没有给出用户/密码时,如果我正确阅读手册,则假定数据库没有登录要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多