Запрос SQL Server ведет себя интерактивно иначе, чем через JDBC — пропускает некоторые таблицы

#sql-server #jdbc

#sql-server #jdbc

Вопрос:

Я пытался получить данные ограничения для всех таблиц, используя SQL-запрос через JDBC.

В моей тестовой базе данных всего 3 таблицы.

Если я выполняю запрос в интерактивном режиме с использованием MS SQL Server Management Studio, я получаю все ожидаемые результаты (т. Е. 3 строки — в каждой из 3 таблиц есть первичный ключ).

если я использую метод JDBC специально для извлечения первичных ключей (как показано ниже), то я также правильно получаю 3 результата:

 ResultSet rs = dbmd.getPrimaryKeys(jdbcCatalog, jdbcSchema, jdbcTableName);
  

Если я использую точно такой же оператор SQL (который я использовал в интерактивном режиме и получил 3 результата обратно) в качестве запроса через JDBC (используя ExecuteQuery (), показанный ниже), то я получаю только 1 результат вместо ожидаемых 3.

 String query =
    "select PK.CONSTRAINT_NAME, PK.TABLE_SCHEMA, PK.TABLE_NAME "  
    "from information_schema.TABLE_CONSTRAINTS PK";
ResultSet rs = null;
try {
    Statement stmt = con.createStatement();
    rs = stmt.executeQuery(query);
}catch (Exception exception) {
    // Exception handler code
}
while (rs.next()){
    // Only executes once.
}
  

Я был бы очень признателен, если бы кто-нибудь мог объяснить, почему SQL-запрос через JDBC выполняется иначе, чем точно такой же SQL-запрос, выполняемый в интерактивном режиме. Может ли это быть проблемой безопасности / владения? (хотя вызов getPrimaryKeys() в JDBC не страдает от этого)
Спасибо.

Ответ №1:

Я не вижу, где вы устанавливаете контекст своей базы данных, но я подозреваю, что в этом проблема. В качестве теста вы можете изменить свой оператор на «select db_name()» и посмотреть, что он возвращает. Если это не та база данных, в которой, по вашему мнению, вы должны находиться, это ваша проблема.

Комментарии:

1. Ого!! Бен, спасибо! Это было все. Я мог бы поклясться, что я был подключен к правильной базе данных, но я был подключен к «master» (возникла проблема с построением строки подключения). Что меня удивило, так это то, что getPrimaryKeys() возвращал правильную информацию.