VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

TDS_FDW

功能描述

Vastbase支持创建外部数据封装器TDS_FDW,用于远程访问SQL Server数据库。

TDS_FDW是一个外部数据封装器(Foreign Data Wrapper,FDW),它允许数据库连接到支持TDS(Tabular Data Stream)协议的外部数据库,如SQL Server和Sybase。使用TDS_FDW插件能直接访问和操作存储在外部系统中的数据,减少数据冗余和复杂的数据管理需求。

注意事项

  • 目前该功能仅限于对普通表和分区表进行查询操作,且不支持在函数和存储过程中使用外表。
  • 目前在函数体中select外表时,如果条件语句中包含参数,会导致条件失效,请谨慎使用。
  • 该插件不支持insert into .... select 语法。

使用tds_fdw

  • 使用tds_fdw需要连接SQL Server,SQL Server请自行安装。

  • 由于使用外部表的后续操作会涉及到user mapping,而Vastbase对此有限制,所以还需要在数据库外使用以下命令生成mapping秘钥。

    vb_guc generate -o usermapping -S default -D $GAUSSHOME/bin
    
  • 加载tds_fdw扩展:

    create extension tds_fdw;
    
  • 创建服务器对象:

    CREATE SERVER
    
  • 创建用户映射:

    CREATE USER MAPPING
    
  • 创建外表:

    CREATE FOREIGN TABLE
    
  • 删除外表:

    DROP FOREIGN TABLE
    
  • 删除用户映射:

    DROP USER MAPPING
    
  • 删除服务器对象:

    DROP SERVER
    
  • 删除扩展:

    DROP extension tds_fdw;
    

示例

前置步骤: 在Vastbase数据中执行如下操作。

1、在操作系统执行如下命令生成密钥。

vb_guc generate -o usermapping -S default -D $GAUSSHOME/bin

2、加载tds_fdw扩展。

create extension tds_fdw;

示例1: 数据库远程访问SQL Server数据库,查询远端普通表。

1、SQL Server数据库:在SQL Server数据库中创建测试表并插入数据。

CREATE DATABASE YourDatabase;
USE YourDatabase; --数据库名

CREATE TABLE remote_table (id INT PRIMARY KEY, year INT, data NVARCHAR(100), amount DECIMAL(10, 2));
INSERT INTO remote_table (id, year, data, amount) VALUES (3, 2022, 'Sample Data 3', 200.00);
INSERT INTO remote_table (id, year, data, amount) VALUES (4, 2022, 'Sample Data 4', 250.00);
INSERT INTO remote_table (id, year, data, amount) VALUES (5, 2023, 'Sample Data 5', 300.00);
INSERT INTO remote_table (id, year, data, amount) VALUES (6, 2023, 'Sample Data 6', 350.00);
INSERT INTO remote_table (id, year, data, amount) VALUES (7, 2024, 'Sample Data 7', 400.00);
INSERT INTO remote_table (id, year, data, amount) VALUES (8, 2024, 'Sample Data 8', 450.00);

2、Vastbase数据库:建立server mapping。

CREATE SERVER sqlserver_new
FOREIGN DATA WRAPPER tds_fdw
OPTIONS(
    servername '172.16.100.23',   --替换为sqlserver所在的host,也可以填ip,请根据实际情况自行修改
    port '1433',   --- sqlserver的默认端口号
    database 'YourDatabase',         --在sqlserver中创建的数据库名
    tds_version '7.4'            --固定值
);

3、Vastbase数据库:建立user mapping。

CREATE USER MAPPING FOR user  -- user是VB数据库的用户名,需要按实际情况填写
SERVER sqlserver_new
OPTIONS (username 'sa', password 'Niu24680@');  -- sa 是sqlserver的默认系统管理员,密码在安装sqlserver的时候设置,

4、Vastbase数据库:创建外表。

CREATE FOREIGN TABLE remote_table (
    id INT,
    year INT,
    data TEXT,
    amount NUMERIC
) SERVER sqlserver_new
OPTIONS (table_name 'remote_table');

5、Vastbase数据库:执行简单的查询。

SELECT id, data, year FROM remote_table;

返回结果为:

NOTICE :Query executed correctly
NOTICE :tds_fdw:Getting results
id |        data     |  year
---+-----------------+-------
3  |   Sample Data 3 |  2022
4  |   Sample Data 4 |  2022
5  |   Sample Data 5 |  2023
6  |   Sample Data 6 |  2023
7  |   Sample Data 7 |  2024
8  |   Sample Data 8 |  2024
(6 rows)

示例2: 数据库远程访问SQLserver数据库,调用存储过程。

1、SQL Server数据库:在SQL Server数据库中创建测试表并插入数据。

CREATE DATABASE YourDatabase1;
USE YourDatabase1; --数据库名

CREATE TABLE Students (id INT PRIMARY KEY,name VARCHAR(50),age INT,grade VARCHAR(10));
INSERT INTO Students VALUES (1, 'Tom', 20, 'A');
INSERT INTO Students VALUES (2, 'Jack', 18, 'B');
INSERT INTO Students VALUES (3, 'Mary', 19, 'A');
INSERT INTO Students VALUES (4, 'John', 21, 'C');
INSERT INTO Students VALUES (5, 'Emma', 20, 'B');
INSERT INTO Students VALUES (6, 'Sophia', 19, 'A');

2、Vastbase数据库:建立server mapping。

CREATE SERVER sqlserver_new_1
FOREIGN DATA WRAPPER tds_fdw
OPTIONS(
    servername '172.16.100.23',   --替换为sqlserver所在的host,也可以填ip,请根据实际情况自行修改
    port '1433',   --- sqlserver的默认端口号
    database 'YourDatabase1',         --在sqlserver中创建的数据库名
    tds_version '7.4'            --固定值
);

3、Vastbase数据库:建立user mapping。

CREATE USER MAPPING FOR user  -- user是VB数据库的用户名,需要按实际情况填写
SERVER sqlserver_new_1
OPTIONS (username 'sa', password 'Niu24680@');  -- sa 是sqlserver的默认系统管理员,密码在安装sqlserver的时候设置,

4、Vastbase数据库:创建外表。

CREATE FOREIGN TABLE Students (
id INT,
name VARCHAR(50),
age INT,
grade VARCHAR(10)
) SERVER sqlserver_new_1
OPTIONS (table_name 'Students');

5、Vastbase数据库:创建存储过程查询远端表。

CREATE OR REPLACE PROCEDURE sp1()
AS
DECLARE
result Students%ROWTYPE;
BEGIN
FOR result IN SELECT * FROM Students LOOP
RAISE NOTICE 'id: %, name: %, age: %, grade: %',
result.id, result.name, result.age, result.grade;
END LOOP;
END;
/

6、Vastbase数据库:调用存储过程。

CALL sp1();

返回结果为:

NOTICE :    tds_fdw: Query executed correctly
CONTEXT:    PL/pgSQL function public.spl() line 4 at FOR over SELECT rows
CONTEXT:    tds_fdw: Getting results
CONTEXT:    PL/pgSQL function public.spl() line 4 at FOR over SELECT rows
NOTICE :    id:1,name:Tom,age:20,grade:A
NOTICE :    id:2,name:Jack,age:18,grade:B
NOTICE :    id:3,name: Mary,NOTICE :age:19,grade:A
NOTICE :    id:4,name: John,age:2l,grade:C
NOTICE :    id:5,name:Emma,age:20,grade:B
NOTICE :    id:6,name:Sophia,age:19,grade:A
  sp1
------

(1 row)