Как решить ошибку «Ошибка входа в систему» ​​(JDBC Java), когда происходит сбой только в одном из двух случаев с проверкой подлинности Windows - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть код Java, который использует JDBC для подключения к двум базам данных моей компании.Администратор дал мне оба разрешения как проверка подлинности Windows .Я могу подключиться и взаимодействовать с обеими базами данных с помощью SQL Server Managment Studio.Проблема в том, что я могу работать только с первой базой данных с JDBC в java, потому что попытка соединиться со второй базой данных приводит к ошибке «не удается открыть базу данных» .

Это странно, потому что я могу отлично работать с первой базой данных, и главный сервер обеих баз данных одинаков.У меня есть драйверы JDBC и файл sqljdbc_auth.dll, необходимый для аутентификации Windows.Я использовал модульные методы, чтобы избежать ошибок типа.Вот код (я изменил некоторые символы в XXX по соображениям безопасности):

package Auto;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.testng.annotations.Test;

public class Test7 
{

    private final static int PORT = 1441;

    /**
     * This is the method that executes the connections
     * @throws Exception 
     */
    @Test
    public void test()
    {
        try
        {
            // === Correct connection with server 1 === //
            String server1Name = "XXXXVPRUBDSQL01\\XXXXDCESQL";
            String databaseName1 = "FacturaElectronicav2";

            String urlServer1 = getURLforconnection(server1Name, databaseName1);
            Connection conn1 = startSQLconnection(urlServer1);

            String table = "dbo.UsersExternal";
            String searcher = "Email";
            String searcherValue = "User@gmail.com";
            String column = "TokenCode";

            String dato = obtainValueFromStatement(conn1, table, searcher, searcherValue, column);

            System.out.println("");
            System.out.println("URL connection: " + urlServer1);
            System.out.println("The conenction was created succesful because this was printed");
            System.out.println("Value: " + dato + " // The value obtained from the statement is correct");
            System.out.println("");

            closeSQLConnection(conn1);

            System.out.println("Here goes the connection failure in the second database");
            System.out.println("");

            // === SECOND DATABASE=== //
            String server2Name = "XXXXVPRUBDSQL01\\XXXXDSSINTSQL";
            String databaseName2 = "SISECPrueba";

            String urlServer2 = getURLforconnection(server2Name, databaseName2);

            // Here the connection fails
            Connection conn2 = startSQLconnection(urlServer2);
        }
        catch ( Exception e )
        {
            // Here the catch handles the exception while trying to connect to the second database
            e.printStackTrace();
        }

    }

    /**
     * Method that creates the url for the connection to the database
     * It uses Windows Authentication [integratedSecurity=true]
     * @param serverName Name of the server connection
     * @param databaseName Name of the database of the server
     * @return The url for the JDBC connection
     */
    public String getURLforconnection(String serverName, String databaseName)
    {
        String url = "jdbc:sqlserver://"+serverName+":"+PORT+";databaseName="+databaseName+";integratedSecurity=true";
        return url;
    }

    /**
     * Creates the connection with the database
     * @param URL URL for the JDBC connection
     * @throws Exception
     */
    public Connection startSQLconnection(String URL) throws Exception
    {
        Connection conn = DriverManager.getConnection(URL);
        return conn;
    }

    /**
     * Closes the connection with the database
     * @throws Exception
     */
    public void closeSQLConnection(Connection Con) throws Exception
    {
        Con.close();
    }

    /**
     * Returns the value searched in the database by the parameters
     * @param Table Table where the value is
     * @param Searcher Identifier of the search
     * @param SearcherValue Value of the identifier
     * @param Column Column of the table
     * @return The value of the statement
     * @throws Exception
     */
    public String obtainValueFromStatement(Connection Con, String Table, String Searcher, String SearcherValue, String Column) throws Exception
    {
        String answer = "";

        String SQLstatement = "SELECT * FROM " + Table + " WHERE " + Searcher + " = '" + SearcherValue + "'";
        Statement statement = Con.createStatement();
        ResultSet rs = statement.executeQuery(SQLstatement);

        if(rs.next()) { answer = rs.getString(Column); }
        else { throw new Exception("It can not be found a registry in the statement"); }

        statement.close();
        rs.close();

        return answer;
    }

}

Ожидаемый результат - правильное соединение с обеими базами данных.Тем не менее, только первое соединение успешно, и значение, полученное из таблицы базы данных, печатается, в то время как второе не удается, как показано в выводе консоли:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite

URL connection: jdbc:sqlserver://XXXXVPRUBDSQL01\XXXXDCESQL:1441;databaseName=FacturaElectronicav2;integratedSecurity=true
The conenction was created succesful because this was printed
Value: 1CE9AAB6-DEC4-481F-81E9-45DAB1D018CC // The value obtained from the statement is correct

Here goes the connection failure in the second database

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot open database "SISECPrueba" requested by the login. The login failed. ClientConnectionId:d122e604-a8e2-4fa7-b1dc-aec3f6e6d9fd
        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:213)
        at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246)
        at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:83)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2908)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2242)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2228)
        at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5574)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1734)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1355)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1022)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:858)
        at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:270)
        at Auto.Test7.startSQLconnection(Test7.java:86)
        at Auto.Test7.test(Test7.java:56)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
        at org.testng.TestRunner.privateRun(TestRunner.java:648)
        at org.testng.TestRunner.run(TestRunner.java:505)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
        at org.testng.SuiteRunner.run(SuiteRunner.java:364)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
        at org.testng.TestNG.runSuites(TestNG.java:1049)
        at org.testng.TestNG.run(TestNG.java:1017)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:283)
        at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)
        at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:120)
        at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:373)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:334)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:119)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:407)

Кажется, что проблема связана с подключениембаза данных SISECPrueba второго сервера, потому что экземпляр сервера правильный.

Наконец, как я уже говорил, у меня есть обычный доступ к обоим серверам с помощью приложения Windows SQL Server Managment Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...