【问题标题】:Connecting Java and Teradata: The UserId, Password or Account is invalid连接 Java 和 Teradata:用户 ID、密码或帐户无效
【发布时间】:2013-11-15 13:46:21
【问题描述】:

我一直在尝试连接到 Teradata

Class.forName("com.teradata.jdbc.TeraDriver");
        String connectionString = "jdbc:teradata://xxx.xxxxxx.com/database=xxxxxx,  tmode=ANSI,  charset=UTF8";
        String user = "Rocket512";
        String password = "aui8mn5";
        Connection conn = DriverManager.getConnection(connectionString, user, password);

得到以下内容

  Exception in thread "main" com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata Database] 
[TeraJDBC 14.10.00.17] [Error 8017] [SQLState 28000] The UserId, Password or Account is invalid.
        at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:300)
        at com.teradata.jdbc.jdbc.GenericLogonController.run(GenericLogonController.java:666)
        at com.teradata.jdbc.jdbc_4.TDSession.<init>(TDSession.java:216)

我知道主机指定正确,因为我没有得到UnknownHost Exception. 我还仔细检查了我的用户名和密码是否正确。


我运行了@beni23 建议的查询(谢谢)

select * 
from dbc.logonoff 
where logdate >= date '2013-10-31'

这是我得到的结果

Bad Password 是什么?我用这个密码使用了 SQL 助手,效果很好。为什么我无法连接 Java?

【问题讨论】:

  • 您确定用户名不区分大小写吗?
  • 是的。另外,两种方法我都试过了
  • 这应该可以工作(不区分大小写的 UID/PWD): java.sql.Connection conn = DriverManager.getConnection("jdbc:teradata:///database="," ","");
  • @BoratSagddiev 你解决问题了吗?

标签: java teradata


【解决方案1】:

LDAP 身份验证失败不会在DBC.LogOnOff 中作为Bad Password 事件捕获,因为身份验证不在数据库上进行。

通常,您收到的错误消息The UserId, Password or Account is invalid. 表示用户帐户被锁定在数据库中。

SELECT U.UserName
     , U.ProfileName
     , U.DefaultAccount
     , COALESCE(P.MAXLOGONATTEMPTS, S.MAXLOGONATTEMPTS) AS MaxLogonAttempts_
     , U.LockedCount
     , U.LockedDate
  FROM dbc.UsersV U
  LEFT JOIN
       dbc.ProfileInfoV P
    ON P.ProfileName = U.ProfileName   
  CROSS JOIN
       dbc.SecurityDefaults S
 WHERE UserName = 'Rocket512';

如果LockedCount 不是0,则自上次成功登录到数据库后发生了一次失败的登录尝试。

如果LockedDate 不是NULL,则表示帐户上次锁定的日期。

MaxLogonAttempts_ 将告诉您在帐户被锁定之前您可以尝试使用数据库身份验证 (TD2) 登录多少次。

我建议的几件事:

  1. 删除connectString参数之间的空格
  2. 将用户和密码参数放入connectString
  3. 使用上面的原始代码修改connectString 以添加:,ACCOUNT=$AMRWRW&amp;DrT&amp;r 这应该与我上面回复中查询返回的内容相匹配(我已添加DefaultAccount)。

编辑:2013 年 11 月 12 日 我可以建议您下载 Teradata Studio Express 并尝试使用 JDBC 连接到同一个 Teradata 系统,就像您在代码中一样。这可能有助于阐明您需要在连接字符串中指定的参数以使连接成功。您应该能够在 Teradata Studio Express 中设置与代码中相同的连接参数,看看它是否有效。

将 LDAP 用作未被授予使用 NULL 密码登录的明确权限的用户的登录机制导致错误消息“用户 ID、密码或帐户无效。”。前几天我使用特权帐户收到此邮件,但没有将我的登录机制从 LDAP 更改为 TD2。

下面的 SQL 返回什么?

SELECT *
  FROM DBC.LogonRulesV
 WHERE UserName = 'Rocket512';

它可能不会返回任何东西,这没关系。这仅仅意味着您从系统上的任何主机使用该用户标识登录的能力尚未被明确授予或撤销。

编辑:2018 年 5 月 22 日 当提供的密码与存储在目录服务器上的密码不匹配时,外部身份验证用户的“密码错误”事件可能会出现在事件日志中。在某些情况下,您可以通过使用 PDN 中的 ldapsearch 直接向 LDAP 目录提交查询来验证这一点。您可以在安全管理手册中找到有关使用此命令的更多详细信息。我发现这是试图对未能对目录进行身份验证的用户帐户子集进行分类的问题。我觉得用更多细节更新这个答案是合适的,因为我在顶部的陈述不是 100% 准确的。

【讨论】:

  • + 1 谢谢。我已经确认我没有被锁定。我可以通过 sql 助手轻松访问。另外,我尝试删除空格并将所有内容都放在连接字符串中,但出现同样的错误
  • @BoratSagddiev - 我添加了第三条建议,因为缺少指定的帐户会导致问题。
  • 谢谢,我已经尝试了所有这些,包括修改字符串。 MaxLogonAttempts = 15Locked Count = 3。还是一样的错误
  • @BoratSagddiev - 我在上面添加了其他详细信息以帮助对问题进行分类。
【解决方案2】:

以下内容可能无法为您提供解决方案,但可能会为您指明正确的方向。我认为您需要通过控制台检查 teradata 中的 dbc.logonoff 表,以确保您的用户没有被锁定或了解您的驱动程序是否在点击 teradata。

select * 
  from dbc.logonoff 
 where logdate >= date '2013-10-31'

【讨论】:

  • 您的输出显示用户为 ROCKET512,您确定您设置的用户名和密码正确吗?尝试交换它们。
  • 很抱歉这是一个错字。一切都是正确的。 username = "Rocket512"password = "aui8mn5"。我的意思是我没有弄乱用户名和密码
【解决方案3】:

阅读这篇文章Troubleshooting Security: The UserId, Password or Account is invalid.我们可以看到这个错误的典型原因。

原因: LOGMECH=LDAP 被指定,并且用户名/密码凭据 在 LOGDATA 中冗余提供,并且作为单独的 连接参数。

解决方案:通过 LOGDATA 识别 LDAP 用户,或 通过单独的用户名/密码参数,但不是两者 同时。

所以,你应该检查一下这个案例。也许你可以在没有用户/密码的情况下获得连接

【讨论】:

  • +1 谢谢。我试过了,这就是我所拥有的:[Error 1032] [SQLState HY000] Single Sign-On NOT supported for Mechanism TD2.
  • @BoratSagddiev 我以前见过这个问题。请阅读本主题forums.teradata.com/forum/connectivity/…
  • @Ilya 链接已过期
【解决方案4】:

也许你的运气会更好:

String driver = "com.teradata.jdbc.TeraDriver";
String conUrl="jdbc:teradata://xxx.xxxxxx.com/database=xxxxxx,USER=Rocket512,PASSWORD=aui8mn5,tmode=ANSI,charset=UTF8";
Class.forName(driver);
Connection dbConn = DriverManager.getConnection(conUrl);

如果这不起作用,请确保使用最新的 jdbc 驱动程序。

【讨论】:

【解决方案5】:

我遇到了类似的错误,并遵循了此处给出的所有建议。我的帐户没有被锁定,我可以通过 SQL 辅助编辑器使用相同的用户名和密码连接到数据库。

对我有用的解决方案是在连接字符串中添加以下行:LOGMECH=LDAP。

您需要了解 Teradata 的登录机制,或者您可以像我一样联系您的 DBA 团队。所以你的连接字符串看起来像这样:

String connurl="jdbc:teradata://xx/database=xx,USER=xx,PASSWORD=xx,tmode=ANSI,charset=UTF8,LOGMECH=LDAP";

【讨论】:

  • 谢谢!到处寻找这个 LOGMECH=LDAP 参数!
  • 如何指定域名?密码?
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2013-08-28
  • 1970-01-01
  • 2018-04-07
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多