全部产品
Search
文档中心

云数据库 RDS:查询SQL Server数据库(tds_fdw)

更新时间:Oct 29, 2024

您可以使用tds_fdw插件访问SQL Server数据库的数据。

前提条件

  • 实例大版本为RDS PostgreSQL 11或以上。

    说明

    暂不支持RDS PostgreSQL 17。

  • 如实例大版本已满足要求,但仍提示不支持,请升级内核小版本,具体操作,请参见升级内核小版本

  • 将RDS PostgreSQL的专有网络网段(例如172.xx.xx.xx/16)添加到SQL Server实例的白名单中,允许RDS PostgreSQL访问。

    说明

    您可以在RDS PostgreSQL实例的数据库连接中查看专有网络网段。查看VPC网段

背景信息

tds_fdw是PostgreSQL外部数据包装器,可以连接到使用Tabular Data Stream(TDS)协议的数据库,例如Microsoft SQL server。

详细说明请参见postgres_fdw

创建插件

连接实例后创建tds_fdw插件,命令如下:

create extension tds_fdw;

使用插件

  1. 创建服务器,示例如下:

    CREATE SERVER mssql_svr
      FOREIGN DATA WRAPPER tds_fdw
      OPTIONS (servername '<连接地址>', port '<连接端口>', database 'tds_fdw_test', tds_version '7.1');
    说明

    服务器定义中的servername必须配置为SQL Server的内网地址,port必须配置为SQL Server的内网端口。

  2. 创建外部表。您可以通过多种方式创建外部表:

    • 使用table_name定义创建外部表,示例如下:

      CREATE FOREIGN TABLE mssql_table (
       id integer,
       data varchar)
       SERVER mssql_svr
       OPTIONS (table_name 'dbo.mytable', row_estimate_method 'showplan_all');
    • 使用schema_name和table_name定义创建外部表,示例如下:

      CREATE FOREIGN TABLE mssql_table (
       id integer,
       data varchar)
       SERVER mssql_svr
       OPTIONS (schema_name 'dbo', table_name 'mytable', row_estimate_method 'showplan_all');
    • 使用query定义创建外部表,示例如下:

      CREATE FOREIGN TABLE mssql_table (
       id integer,
       data varchar)
       SERVER mssql_svr
       OPTIONS (query 'SELECT * FROM dbo.mytable', row_estimate_method 'showplan_all');
    • 使用远程列名创建外部表,示例如下:

      CREATE FOREIGN TABLE mssql_table (
       id integer,
       col2 varchar OPTIONS (column_name 'data'))
       SERVER mssql_svr
       OPTIONS (schema_name 'dbo', table_name 'mytable', row_estimate_method 'showplan_all');
  3. 创建用户映射,示例如下:

    CREATE USER MAPPING FOR postgres
      SERVER mssql_svr 
      OPTIONS (username 'sa', password '123456');
  4. 导入外部模式,示例如下:

    IMPORT FOREIGN SCHEMA dbo
      EXCEPT (mssql_table)
      FROM SERVER mssql_svr
      INTO public
      OPTIONS (import_default 'true');