2017-07-03 136 views
0

我試圖用JDBC元數據檢索給定表的FK。爲此,我使用「getImportedKeys」函數。JDBC檢索外鍵列名稱(sybase ase)

對於我的表「cash_mgt_strategy」,它給了ResultSet中:

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工作區),其中顯示了表的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測試過,同樣的問題。

感謝

+0

請注意,我已經測試了對稱方式,使用PK表上的「getExportedKeys」...但它給出了完全相同的結果/問題。 – Alexxx

+0

好的,所以我檢查了getMaxColumnNameLength();這是30.但奇怪的是,當我用「getColumns()」函數檢索我的表的列時,我已經成功檢索了全名「fx_est_execution_strategy_policy_id」。這裏檢索的名字是'fx_est_execution_strategy_policy',它是33字符長度,不是30. – Alexxx

回答

1

您沒有提供您的ASE的版本,所以我會假設:

  • 數據服務器在某些點上運行ASE 12.x的(限30個字符的描述符名)
  • 數據服務器升級到ASE 15.x/16.x(描述符名稱擴展爲255個字符)
  • DBA在升級到ASE 15.x/16.x後升級/更新sp_jdbc * procs失敗(因此舊的ASE 12 .x版本的procs描述符限於30個字符 - 仍在數據服務器中使用)

如果以上情況屬實,則sp_version應顯示在dataserver中運行的jdbc procs的舊版本。 (顯而易見的)解決方案是讓DBA加載最新版本的jdbc存儲過程(通常位於$ {SYBASE}/jConnect */sp下)。

注:可能不會傷害有DBA回顧從sp_version輸出,看看是否有需要加載(如installmodelinstallsecurityinstallcommit等),其他任何升級腳本。

+0

你對從12到16的遷移是正確的。sp_version結果包含9行,8行指向16.0 SP2; 1指jdbc 1004的jconnect。9行處於狀態「完成」。我寫信給DBA來檢查這個bug並修補jdbc存儲過程。希望我能在幾個月內得到補丁...:/謝謝你的回答。 – Alexxx

+1

看起來像我錯過了......看着ASE 16.0 SP02 PL04附帶的存儲過程...#jfkeys表中的'keys'列仍然被編碼爲varchar(32) ';除非ASE 16.0 SP03 codeline已經修復,否則您需要打開一個技術支持案例才能獲得永久修復;在此期間,對proc和/或install腳本進行快速編輯(將'keys'列更改爲'varchar(257)')應該可以幫助你完成這個任務......儘管你需要留意任何其他差異 – markp

0

好了,我已經做了我的數據庫服務器上的一些搜索和我已經找到存儲過程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) 

用於存儲列名(用於PK和FK)的臨時表#jpkeys和#jfkeys與VARCHAR(32)類型的,而不是257!

現在需要搜索如何修補/更新這些存儲過程。