连接Java和Teradata:用户ID、密码或帐户无效

连接Java和Teradata:用户ID、密码或帐户无效,java,teradata,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";

我一直在尝试连接到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)
这是我得到的结果


什么是坏密码?我用这个密码使用了SQL Assistant,效果非常好。为什么我不能用Java连接?

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

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

也许你在以下方面会更幸运:

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

阅读本文,我们可以看到此错误的典型原因

原因:LOGMECH=LDAP已指定,并且用户名/密码凭据 在日志数据中冗余提供,并单独提供 连接参数

解决方案:通过日志数据识别LDAP用户,或 通过单独的用户名/密码参数,但不能同时通过这两个参数 同时


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

LDAP身份验证失败将不会在
DBC中捕获。注销
将作为
错误密码
事件,因为身份验证不会在数据库上进行

通常,您收到的错误消息,
用户ID、密码或帐户无效。
,表示用户帐户被锁定在数据库上

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
,则自上次成功登录数据库以来,登录尝试失败

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';
如果
LockedDate
不是
NULL
,则表示上次锁定帐户的日期

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

我有几点建议:

  • 删除
    connectString
  • 将用户和密码参数放入
    connectString
  • 使用上面的原始代码修改
    connectString
    以添加:
    ,ACCOUNT=$AMRWRW&DrT&r
    ,它应该与上面我的响应中查询返回的内容匹配(我添加了
    DefaultAccount
  • 编辑:11/12/13 我建议您下载Teradata Studio Express,并尝试使用JDBC连接到同一Teradata系统,就像您在代码中看到的一样。这可能有助于阐明为使连接成功而需要在连接字符串中指定的参数。您应该能够在Teradata Studio Express中设置与代码中相同的连接参数,并查看其是否有效

    将LDAP用作未被授予使用空密码登录的显式权限的用户的登录机制会导致错误消息“用户ID、密码或帐户无效”。前几天,我使用一个特权帐户收到了这个消息,而没有将我的登录机制从LDAP更改为TD2

    下面的SQL返回什么

    SELECT *
      FROM DBC.LogonRulesV
     WHERE UserName = 'Rocket512';
    
    它可能不会返回任何东西,这没关系。这仅仅意味着您从系统上的任何主机使用该用户ID登录的能力尚未被明确授予或撤销

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

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

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

    您需要知道Teradata的登录机制,或者可以像我一样联系DBA团队。因此,您的连接字符串将如下所示:


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

    您的输出将用户显示为ROCKET512,您确定正确设置了用户名和密码吗?试着换一下。很抱歉这是个打字错误。一切都是正确的
    username=“Rocket512”
    password=“aui8mn5”
    。我的意思是我没有搞乱用户名和密码你确定用户名不区分大小写吗?是的。此外,我还尝试了这两种方法(不区分大小写的UID/PWD):java.sql.Connection conn=DriverManager.getConnection(“jdbc:teradata:///database=","","");@BoratSagddiev你解决问题了吗?+1这是最新的问题,仍然是相同的错误8017+1谢谢。我尝试了这个,这就是我所拥有的:
    [Error 1032][SQLState HY000]机制TD2不支持单点登录。
    @boratsagdiev我以前见过这个问题。请阅读此主题@Ilya链接已过时+1谢谢。我已确认我没有被锁定。我可以通过sql助手轻松访问。此外,我还尝试删除空格并将所有内容放入连接字符串中,但都是一样的error@BoratSagddiev-我已经添加了第三个建议,因为缺少指定的帐户可能会导致问题。谢谢,我已经尝试了所有这些,包括修改字符串<代码>最大值