使用H2 Web界面浏览Corda数据库表时出现SYNONYMS表不存在错误
嘿,我之前查询Corda的H2数据库时也碰到过一模一样的问题!这个错误的根源很明确:你用的数据库客户端(比如DBeaver、H2 Console)在自动拉取表列表时,默认执行了包含INFORMATION_SCHEMA.SYNONYMS的查询,但Corda默认使用的H2数据库版本(从错误代码42102-197来看是H2 1.4.197)的元数据里根本没有SYNONYMS表,所以直接触发了这个不存在表的报错。
下面是几个快速解决的方案:
调整数据库客户端的连接配置
大部分数据库客户端(比如DBeaver)在连接H2时,有一个“获取同义词”或者类似的选项,你只需要找到这个选项并禁用它即可。以DBeaver为例:- 打开H2连接的编辑窗口
- 切换到「高级」选项卡
- 找到「元数据」相关设置,取消勾选“获取同义词”
保存配置后重新连接,客户端就不会再查询SYNONYMS表了。
手动执行简化版的表查询语句
如果你不想调整客户端配置,直接手动查询INFORMATION_SCHEMA.TABLES就能获取所有Corda相关的表,跳过SYNONYMS的部分。执行以下SQL:SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA', 'SYSTEM_LOBS') ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME;这个语句会过滤掉系统自带的schema,只展示Corda的业务表(比如
NODE_TRANSACTIONS、VAULT_STATES这些核心表)。直接查询目标业务表
如果你已经知道要查询的表名,直接写针对该表的查询语句就行,比如查看Vault里的状态:SELECT * FROM VAULT_STATES LIMIT 10;完全不需要依赖客户端自动生成的包含SYNONYMS的元数据查询语句。
另外补充一点:Corda的表命名很有规律,NODE_前缀的是节点运行相关的表,VAULT_前缀的是资产库相关表,CONTRACT_前缀的是合约相关表,你可以根据前缀快速定位需要的表。
内容的提问来源于stack exchange,提问作者Shailesh Pratapwar

