JDBC извлекает имя столбца внешнего ключа (sybase ase)

Я пытаюсь получить FK данной таблицы с метаданными JDBC. Для этого я использую функцию "getImportedKeys".

Для моей таблицы cash_mgt_strategy это даст результат:

PKTABLE_CAT : 'HAWK'
PKTABLE_SCHEM : 'dbo'
PKTABLE_NAME : 'fx_execution_strategy_policy'
PKCOLUMN_NAME : 'fx_execution_strategy_policy_id'
FKTABLE_CAT  : 'HAWK'
FKTABLE_SCHEM  : 'dbo'
FKTABLE_NAME  : 'cash_mgt_strategy'
FKCOLUMN_NAME  : 'fx_est_execution_strategy_policy'
KEY_SEQ  : '1'
UPDATE_RULE  : '1'
DELETE_RULE  : '1'
FK_NAME  : 'fk_fx_est_execution_strategy_policy'
PK_NAME  : 'cash_mgt_s_1283127861'
DEFERRABILITY  : '7'

Проблема в том, что "FKCOLUMN_NAME: 'fx_est_execution_strategy_policy'" не является реальным столбцом моей таблицы, но кажется, что оно усечено? (отсутствует "_id" в конце)

При использовании официального клиента Sybase sql (Sybase Workspace) отображение DDL таблицы дает для этого ограничения / внешнего ключа:

ALTER TABLE dbo.cash_mgt_strategy ADD CONSTRAINT fk_fx_est_execution_strategy_policy FOREIGN KEY (fx_est_execution_strategy_policy_id)
REFERENCES HAWK.dbo.fx_execution_strategy_policy (fx_execution_strategy_policy_id)

Поэтому мне интересно, как получить полное имя FKCOLUMN_NAME?

Обратите внимание, что я использую jconnect 6.0. Я тестировал с jconnect 7.0, та же проблема.

Спасибо

2 ответа

Решение

Вы не предоставили свою версию ASE, поэтому я предполагаю следующее:

  • В какой-то момент dataserver выполнял ASE 12.x (имена дескрипторов ограничены 30 символами)
  • Сервер данных был обновлен до ASE 15.x/16.x (имена дескрипторов расширены до 255 символов)
  • Администратору баз данных не удалось обновить / обновить процессы sp_jdbc* после обновления до ASE 15.x/16.x (следовательно, старая версия ASE 12.x для procs - дескрипторы ограничены 30 символами - все еще используется в сервере данных)

Если вышеизложенное верно, то sp_version должен показывать старые версии процессов jdbc, работающих в сервере данных.

(Очевидное) решение состоит в том, чтобы администратор БД загружал последнюю версию хранимых процедур jdbc (обычно находится в ${SYBASE}/jConnect*/sp).

ПРИМЕЧАНИЕ: вероятно, не мешало бы, чтобы администратор БД проверил вывод sp_version чтобы увидеть, есть ли какие-либо другие сценарии обновления, которые нужно загрузить (например, installmodel, installsecurity, installcommit, так далее).

Итак, я провел поиск на своем сервере БД и нашел код хранимой процедуры sp_jdbc_importkey. В этом коде можно увидеть:

create table #jfkey_res( 
    PKTABLE_CAT        varchar(32) null,
    PKTABLE_SCHEM      varchar(32) null,
    PKTABLE_NAME       varchar(257) null,
    PKCOLUMN_NAME      varchar(257) null,
    FKTABLE_CAT        varchar(32) null,
    FKTABLE_SCHEM      varchar(32) null,
    FKTABLE_NAME       varchar(257) null,
    FKCOLUMN_NAME      varchar(257) null,
    KEY_SEQ            smallint,
    UPDATE_RULE        smallint,
    DELETE_RULE        smallint,
    FK_NAME            varchar(257),
    PK_NAME            varchar(257) null)
create table #jpkeys(seq int, keys varchar(32) null)
create table #jfkeys(seq int, keys varchar(32) null)

Временные таблицы #jpkeys и #jfkeys, используемые для хранения имен столбцов (для PK и FK), набираются с помощью varchar(32) вместо 257!!

Нужно искать, как патчить / обновлять тезисы, хранящиеся сейчас

Другие вопросы по тегам