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
的输出以查看是否有任何其他需要加载的升级脚本(例如,installmodel
、installsecurity
、installcommit
、等等)。
我正在尝试使用 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
的输出以查看是否有任何其他需要加载的升级脚本(例如,installmodel
、installsecurity
、installcommit
、等等)。