【问题标题】:JDBC retrieve foreign keys columns name (sybase ase)JDBC 检索外键列名(sybase ase)
【发布时间】:2017-07-03 08:42:11
【问题描述】:

我正在尝试使用 JDBC 元数据检索给定表的 FK。 为此,我使用了“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 测试过,同样的问题。

谢谢

【问题讨论】:

  • 请注意,我已经通过在 PK 表上使用“getExportedKeys”测试了对称方式......但它给出了完全相同的结果/问题。
  • 好的,所以我检查了 getMaxColumnNameLength();这是 30。但真正奇怪的是,当我使用“getColumns()”函数检索表的列时,我成功地检索了整个名称“fx_est_execution_strategy_policy_id”。这里检索到的名称是 'fx_est_execution_strategy_policy',它是 33 字符长度,而不是 30。

标签: jdbc foreign-keys sap-ase


【解决方案1】:

您尚未提供您的 ASE 版本,因此我将假设以下情况:

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

如果上述情况属实,那么sp_version 应该显示在数据服务器中运行的旧版本的 jdbc procs。

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

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

【讨论】:

  • 从 12 迁移到 16 是对的。sp_version 结果包含 9 行,8 行参考 16.0 SP2; 1 参考jconnect for jdbc 1004。9 行处于“完成”状态。我已经写信给 DBA 来检查这个错误并修补 jdbc 存储过程。希望我能在几个月内得到补丁......:/感谢您的回答。
  • 看起来我说错了...查看 ASE 16.0 SP02 PL04 附带的存储过程...#jfkeys/#jpkeys 表中的keys 列仍然编码为varchar(32);除非 ASE 16.0 SP03 代码行已修复,否则您需要通过技术支持打开一个案例以永久修复此问题;与此同时,快速编辑 proc 和/或安装脚本(将 keys 列更改为 varchar(257))应该会让你克服这个困难......尽管你要留意任何其他差异
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多