Perl DBI:连接到使用Windows身份验证的SQL Server

时间:2012-03-07 05:54:47

标签: perl dbi

我正在使用perl DBI连接到SQL Server。此服务器使用Windows身份验证。如何通过DBI将此信息传递给SQL服务器?

2 个答案:

答案 0 :(得分:2)

我认为“使用Windows身份验证”意味着您的脚本在Windows上运行。然后有不止一种方法可以做到这一点。您可以使用ADO而不是ODBC,而不需要创建DSN:

  my $db_instance = ".\\SQLEXPRESS";
  my $db_name     = "AdventureWorks";
  my $db_user     = "sa";
  my $db_pass     = "...";

  my $n = 0;
  for my $cs (
      "DBI:ODBC:Driver={SQL Server};Server=$db_instance;Database=$db_name;UID=$db_user;PWD=$db_pass"
    , "DBI:ODBC:Driver={SQL Server};Server=$db_instance;Database=$db_name;"
    , "DBI:ODBC:DSN=AdvWork;"
    , "DBI:ADO:DSN=AdvWork;"
    , "DBI:ADO:Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=$db_name;Data Source=$db_instance;"
    , "DBI:ADO:Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=$db_pass;Initial Catalog=$db_name;Data Source=$db_instance;"
    , "DBI:ADO:Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID=\"\";Initial Catalog=$db_name;Data Source=$db_instance;Initial File Name=\"\";Server SPN=\"\";"
  ) {
     my $dbh = DBI->connect($cs) or die("\nCONNECT ERROR:\n$DBI::errstr");
     my $wtf = $cs;
     $wtf =~ s/$db_pass/secret/;
     printf "%2d CS: '%s'\n", ++$n, $wtf;
     $dbh->disconnect();
  }

输出:

xpl.pl::Main started using Perl 5.010000 on MSWin32.
will call CnctMSSS - connect to MS SQLServer (SQLExpress)
 1 CS: 'DBI:ODBC:Driver={SQL Server};Server=.\SQLEXPRESS;Database=AdventureWorks;UID=sa;PWD=secret'
 2 CS: 'DBI:ODBC:Driver={SQL Server};Server=.\SQLEXPRESS;Database=AdventureWorks;'
 3 CS: 'DBI:ODBC:DSN=AdvWork;'
 4 CS: 'DBI:ADO:DSN=AdvWork;'
 5 CS: 'DBI:ADO:Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Advent
ureWorks;Data Source=.\SQLEXPRESS;'
 6 CS: 'DBI:ADO:Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=secret;Initial Catalog=Adventur
eWorks;Data Source=.\SQLEXPRESS;'
 7 CS: 'DBI:ADO:Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial C
atalog=AdventureWorks;Data Source=.\SQLEXPRESS;Initial File Name="";Server SPN="";'
CnctMSSS returned 0 [5.858424 secs]
xpl.pl::Main done. (0)

如果比较(1)[基于this contribution]和(2),您会发现跳过用户信息足以连接到数据库;一些驱动程序/提供商可能喜欢添加“集成安全性= SSPI”。

Here是一个很好的起点,如果您需要帮助来尝试连接字符串。

答案 1 :(得分:1)

我认为您正在使用DBD :: ODBC。在ODBC管理器中为使用Windows身份验证创建SQL Server的数据源,然后在没有用户名和密码的情况下调用DBI的connect方法。