【问题标题】:Connecting to Teradata via Perl通过 Perl 连接到 Teradata
【发布时间】:2011-09-25 08:53:52
【问题描述】:

有人在这方面取得了成功吗?网上没有很多参考资料,我已经用尽了谷歌上的所有相关结果。这是我的脚本:

#!/usr/bin/perl

use DBI;
use DBD::ODBC;

$user = "user";
$pw = "pw";
$ip = "192.168.1.0"

#DBI->trace(DBD::ODBC->parse_trace_flags('odbconnection'));

#my $connect_attrs = { PrintError => 0, RaiseError => 1, AutoCommit => 1 };

my $dbh = DBI->connect("dbi:ODBC:$ip", $user, $pw);

错误信息:

DBI connect('192.168.1.0','user',...) failed: (no error string) at ./teradata.pl line 13

被注释掉的两行是我之前尝试连接数据库但无果而终的结果。

更新:这是我之前使用 DBD 模块所做的努力。

#!/usr/bin/perl

use DBI;

$user = "xxxx";
$pw = "xxxx";

my $dbh = DBI->connect("dbi:Teradata:tdsn", $user, $pw);

错误:

DBI connect('tdsn','xxxx',...) failed: Unable to get host address. at ./teradata.pl line 12

第二次尝试:

#!/usr/bin/perl

use DBI;

$user = "xxxx";
$pw = "xxxx";

my $dbh = DBI->connect("dbi:Teradata:192.168.1.0", $user, $pw);

错误:

DBI connect('192.168.1.0','xxxx',...) failed: Deprecated logons are not allowed by administrator.  Upgrade client software to latest version. at ./teradata.pl line 12

第三...

#!/usr/bin/perl

use DBI;
use DBD::ODBC;

$user = "xxxx";
$pw = "xxxx";

my $dbh = DBI->connect("dbi:ODBC:tdsn", $user, $pw);

.odbc.ini

[ODBC]
InstallDir              = /usr/odbc
Trace           = 0
TraceDll                = /usr/odbc/lib/odbctrac.so
TraceFile               = /home/xxxx/odbctrace.log
TraceAutoStop           = 0

[ODBC Data Sources]
default         = tdata.so
testdsn         = tdata.so

[default]
Driver          = /usr/odbc/drivers/tdata.so
Description             = Default DSN is Teradata 5100
DBCName         = **ip_addr**
LastUser                = DLPStats
Username                = xxxx
Password                = xxxx
Database                = MSS_TEMP
DefaultDatabase         = MSS_TEMP

[tdsn]
Driver=/usr/odbc/drivers/tdata.so
Description=Teradata running Teradata V1R5.2
DBCName=**ip_addr**
LastUser=
Username=xxxx
Password=xxxx
Database=
DefaultDatabase=

错误:

DBI connect('tdsn','xxxx',...) failed: (no error string) at ./teradata.pl line 13

odbcinst.ini

[ODBC DRIVERS]
Teradata=Installed

[Teradata]
Driver=/usr/odbc/drivers/tdata.so
APILevel=CORE
ConnectFunctions=YYY
DriverODBCVer=3.51
SQLLevel=1

【问题讨论】:

  • DBI 模块是否为 Teradata 提供接口?改用DBD::Teradata 模块
  • 我已经尝试过了,但该模块对于我的 Teradata 版本来说已经过时了。给我一个关于不推荐使用的登录凭据的错误。
  • 好吧,我只是用谷歌搜索了一下,发现几乎每个人都没有对 Teradata 的 DBI 或 DBD::ODBC 感到满意。我可以建议的另外一个是......尝试使用 Teradata 客户端附带的 Teradata ODBC 驱动程序,看看它是否能让您通过
  • 您使用的是什么版本的 DBD::ODBC 以及哪个 ODBC 驱动程序管理器。

标签: sql perl odbc teradata dbd


【解决方案1】:

您需要下载并安装Teradata DBD 模块。

【讨论】:

  • 我已经尝试连接该模块;我将附加脚本和错误消息。
【解决方案2】:

$ip 不能是 IP 地址。它必须是您的 ODBC 驱动程序管理器已知的 ODBC 数据源的名称。我们需要了解您的司机经理才能提供进一步帮助。假设它是 unixODBC,您将拥有一个 odbcinst.ini 文件,需要在其中命名 teradata 驱动程序,其中一行指向驱动程序共享对象。然后在 odbc.ini 文件中创建一个数据源。

【讨论】:

  • 昨天想通了。我在帖子中添加了其他信息。
  • 所以我猜(从那些 ini 文件中)您正在使用 iODBC 驱动程序管理器?不是我的专业领域,因为我使用的是 unixODBC。但是,我会从您的文件中说“tdsn”是要使用的正确 DSN,因此 DBI 字符串需要是“dbi:ODBC:tdsn”。如果这不起作用设置并导出 DBI_TRACE=15=x.log 并添加“DBI->trace(DBD::ODBC->parse_trace_flags('odbcconnection|odbcunicode'));”在调用连接之前。运行代码后,让我们看看 x.log 中的内容。
【解决方案3】:

我很确定你已经找到了答案,但无论如何我都会发布它以防其他人需要它:

odbcinst.ini:

[Teradata Database ODBC Driver 16.20]
Description=Teradata Database ODBC Driver 16.20
Driver=/opt/teradata/client/16.20/odbc_64/lib/tdataodbc_sb64.so
# Note: Currently, Data Direct Driver Manager does not support Connection Pooling feature.
CPTimeout=60

odbc.ini:

[ODBC Data Sources]
16.10=Teradata Database ODBC Driver 16.20
15.10=Teradata Database ODBC Driver 16.20
13.00=Teradata Database ODBC Driver 16.20
13.10=Teradata Database ODBC Driver 16.20
14.00=Teradata Database ODBC Driver 16.20

注意数据源的名称可以是任何东西,我在这种情况下选择了版本。

Perl 代码:

use DBD::ODBC;

my $conn = DBI->connect("DBI:ODBC:14.00",$username,$password);
#note how I'm connecting to the data source 14.00

my $create_user = $conn->prepare("CREATE USER $db_user from $username as perm = $perm, 
                                                password = XXXXXX,
                                                spool = $spool,
                                                NO fallback protection,
                                                default database = $db_user,
                                                NO after journal");
my $status = $create_user->execute();
$conn->disconnect();

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2016-06-25
    • 2023-03-24
    • 2021-03-15
    • 2018-09-06
    • 2016-05-21
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多