连接Java和Teradata:UserId,密码或帐户无效

时间:2013-11-04 20:12:12

标签: java teradata

我一直在尝试连接到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'

这是我得到的结果

enter image description here

什么是Bad Password?我使用SQL Assistant使用这个密码,效果很好。为什么我不能用Java连接?

5 个答案:

答案 0 :(得分:6)

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. 参数之间的空格
  3. 将用户和密码参数放在connectString
  4. 使用上面的原始代码修改connectString以添加:,ACCOUNT=$AMRWRW&DrT&r,它应与我上面的回复中的查询返回的内容相匹配(我添加了DefaultAccount)。
  5. 编辑:2013年12月12日 我建议您下载Teradata Studio Express并尝试使用JDBC建立与相同Teradata系统的连接,就像您在代码中一样。这可能有助于阐明您需要在连接字符串中指定的参数,以使连接成功。您应该能够在Teradata Studio Express中设置与代码中相同的连接参数,看看它是否有效。

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

    以下SQL返回什么内容?

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

    它可能不会返回任何东西,这没关系。这只是意味着您无法从系统上的任何主机登录该用户标识,但尚未明确授予或撤消。

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

答案 1 :(得分:3)

以下可能无法为您提供解决方案,但可能会指出您正确的方向。我想你想通过一个控制台检查teradata中的dbc.logonoff表,以确保你的用户没有被锁定或者知道你的驱动程序是否正在击中teradata。

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

答案 2 :(得分:2)

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

  

原因: LOGMECH =指定了LDAP,以及用户名/密码凭据   LOGDATA和单独的冗余提供   连接参数。

     

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

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

答案 3 :(得分:1)

也许你可能会有更多运气:

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驱动程序。

答案 4 :(得分:1)

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

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

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

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