JDBC 检索外键列名 (sybase ase)

JDBC retrieve foreign keys columns name (sybase ase)

我正在尝试使用 JDBC 元数据检索给定 table 的 FK。 为此,我使用了 "getImportedKeys" 函数。

对于我的 table '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'" 不是我的 table 的真实栏目,但它似乎被截断了? (末尾缺少“_id”)

当使用官方 Sybase sql 客户端(Sybase 工作区)时,显示 table 的 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 测试过,同样的问题。

谢谢

好的,所以我在我的数据库服务器上做了一些搜索,我找到了存储过程的代码 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!!

现在需要搜索如何修补/更新这些存储过程。

您还没有提供您的 ASE 版本,所以我假设如下:

  • 数据服务器在某些时候是 运行 ASE 12.x(描述符名称限制为 30 个字符)
  • 数据服务器已升级到 ASE 15.x/16.x(描述符名称扩展到 255 个字符)
  • DBA 在升级到 ASE 15.x/16.x 后未能 upgrade/update sp_jdbc* procs(因此旧的 ASE 12.x 版本的 procs -限制为 30 个字符的描述符 - 仍在数据服务器中使用)

如果以上为真,那么 sp_version 应该在数据服务器中显示旧版本的 jdbc 过程 运行。

(显而易见的)解决方案是让 DBA 加载最新版本的 jdbc 存储过程(通常位于 ${SYBASE}/jConnect*/sp 下)。

注意:让 DBA 检查 sp_version 的输出以查看是否有任何其他需要加载的升级脚本(例如,installmodelinstallsecurityinstallcommit、等等)。