使用Navicat获取某表的表结构设计信息时,报错:ERROR: column

提示:

最好解决方案,使用最新版Navicat 11版本,附上下载地址

http://dblt.xiazaiba.com/Soft/N/Navicat_Premium_11.0.10_XiaZaiBa.exe


使用Navicat获取某表的表结构设计信息时,报错:ERROR: column "spclocation" does not exist

 

一:环境

Postgresql 服务器OS:linux (Red Hat Enterprise Linux AS release 4 (Nahant Update 6))

PostgreSQL 服务器版本:9.2.2

Navicat premium 客户端版本:9.1.9中文版,安装在Windows xp下

二:发现问题

在Windows xp中,用Navicat premium访问PostgreSQL数据库test_zqs中的h_fk_info表的设计信息,报错:

ERROR: column "spclocation" does not exist

LINE 1: ...oid,spcname,pg_get_userbyid(spcowner) AS owner,spclocatio...

同样的报错信息也会出现在用Navicat客户端创建表(非sql语句建表)时。

详细见下图1

图1

三:分析问题

初始看到这个问题,感觉很惊讶,心想在表h_fk_info中没有spclocation字段是不错,但你报这样一个错误,不是怀疑俺的智商吗?

在网上搜索此问题的解决方案,没有搜到,无奈只好自己分析问题。

很显然,这个报错跟用户表h_fk_info中有无“spclocation”字段是没有关系的,既然如此,那么一定是在显示h_fk_info表设计时发生了某个查询报出的。而这个查询要查询的某张表中一定不含此字段,但是查询结果却要显示“spclocation”字段的值,所以抛出了异常。

鉴于以上,可以知道Navicat Premiun在显示用户表h_fk_info的表设计时,要查询的这张表一定是系统表,只不过在PostgreSQL数据库版本为9.2.2中,该系统表不含有“spclocation”字段。但是幸运的是,之前用同一Navicat Premium客户端查看PostgreSQL数据库(版本为8.2.14)某用户表的设计时,却没有报错。这足以说明一个事实,那就是同一版本Navicat Premium客户端显示不同版本的PostgreSQL表设计的过程中,发生sql查询应是相同的,并且在PostgreSQL 8.2.14版本数据库中存在一张系统表,该系统表中含有“spclocation”字段。

接下来,就是通过8.2.14版本的PostgreSQL数据库找出这张系统表,字段“spclocation”没有对应的中文意思,但根据经验此字段英文名称命名应是组合命名,正好该字段英文名称的包含“location”,而其代表的含义是“位置”、“地点”,这让人很容易想到表空间,通过psql客户端查询(\dS)出来所有系统表,再在其中找出存储表空间信息的pg_tablespace表。

对8.2.14版本系统表pg_tablespace字段的查看,见图2:

 

可以看出来,在8.2.14版本的数据库中系统表pg_tablespace中含有“spclocation”字段,下面再来对比下9.2.2版本的数据库系统表pg_tablespace,见图3

 

在图3中,pg_tablespace果真不包含“spclocation”字段。

下面,就8.2.14版本、9.2.2版本系统表pg_tablespace的属性含义给出说明,见表1

 

四:解决问题

通过以上分析,要解决此问题,理论上只需为9.2.2版本的系统表pg_tablespace增加一列spclocation即可(但不建议这么做,可能会引起其他不可预知问题),但事实上,这样做时,报错了,见下文:

test_zqs=# alter table pg_tablespace add column spclocation text;

ERROR:  permission denied: "pg_tablespace" is a system catalog

修改系统表是行不通的,换种思路,可以用最新版本的Navicat Premium,其中Navicat Premium 10.1.7已解决此问题,低于10.1.7版本的未知。

 

点赞