ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

pgsql 外表的坑

2022-06-14 22:04:20  阅读:185  来源: 互联网

标签:外表 SQL DB Server pgsql error org OPTIONS


项目中需要查询 SQL Server(老系统) 和 pgsql 中的数据,索性就将 SQL Server 的表作为外表在 pgsql 中创建:

-- 使用 tds_fdw 扩展插件创建一个外部数据库连接服务
CREATE SERVER mssql_svr FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername '192.168.1.37', port '1433', character_set 'UTF-8', database 'sql_server');

-- 为本地数据库用户 postgres 在外部数据库连接服务 mssql_svr 上创建用户映射,对应了远程数据库的 sa 用户
CREATE USER MAPPING FOR postgres SERVER mssql_svr OPTIONS (username 'sa', password 'sql2008});

-- 创建外表
CREATE FOREIGN TABLE warranty_promotion."organization" (
    id          char(36)           NOT NULL,
    org_name    varchar(100)       NOT NULL,
    org_code    varchar(20)        NOT NULL,
    manager_id  char(36)           NOT NULL,
) SERVER mssql_svr OPTIONS (table 'org');

CREATE FOREIGN TABLE pgsql.user (
    id           varchar(50) OPTIONS (column_name 'ID'),
    user_name    varchar(50)  OPTIONS (column_name 'Username'),
    email        varchar(200) OPTIONS (column_name 'Email')
) SERVER mssql_svr OPTIONS (table 'user');

在进行外表的关联查询时,经常会报错:

### The error may exist in file [D:\Source\***-persistence\target\classes\mybatis\mapper\OrganizationDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT t1.id, t1.org_name, t2.email as managerEmail FROM pgsql.organization t1 JOIN pgsql.user t2 ON t1.manager_id = t2.id WHERE t1.org_code IN ( ? )
### Cause: org.postgresql.util.PSQLException: ERROR: DB-Library error: DB #: 20018, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: , Level: 16
; uncategorized SQLException; SQL state [HV00L]; error code [0]; ERROR: DB-Library error: DB #: 20018, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: , Level: 16; nested exception is org.postgresql.util.PSQLException: ERROR: DB-Library error: DB #: 20018, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: , Level: 16
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)

一种解决方法是,如果查询到了结果,缓存到本地,可以尽量避免报错。

另一种解决方法是使用多数据源,不会出现这种奇怪的问题,推荐使用

标签:外表,SQL,DB,Server,pgsql,error,org,OPTIONS
来源: https://www.cnblogs.com/ageovb/p/16376576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有