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!!
Нужно искать, как патчить / обновлять тезисы, хранящиеся сейчас