TDS_FDW
功能描述
Vastbase支持创建外部数据封装器TDS_FDW,用于远程访问SQL Server数据库。
TDS_FDW是一个外部数据封装器(Foreign Data Wrapper,FDW),它允许数据库连接到支持TDS(Tabular Data Stream)协议的外部数据库,如SQL Server和Sybase。
使用TDS_FDW插件能直接访问和操作存储在外部系统中的数据,减少数据冗余和复杂的数据管理需求。
注意事项
目前该功能仅限于对普通表和分区表进行查询操作,且不支持在函数和存储过程中使用外表。
目前在函数体中查询外表时,如果条件语句中包含参数,会导致条件失效,请谨慎使用。
该封装器插件不支持
insert into .... select
语法。该封装器插件支持的Vastbase版本:
V2.2 Build 15 (Patch No.2)及以后补丁版本。
V2.2 Build 16及以后版本。
使用TDS_FDW
使用TDS_FDW需要连接SQL Server数据库,SQL Server数据库请自行安装。
由于使用外部表的后续操作会涉及到使用user mapping,所以还需要在操作系统中使用以下命令生成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;
示例
前置步骤:
1、在安装Vastbase数据库的操作系统中执行如下命令生成密钥。
vb_guc generate -o usermapping -S default -D $GAUSSHOME/bin
2、在Vastbase数据库中加载TDS_FDW扩展。
create extension tds_fdw;
示例1: Vastbase数据库远程访问SQL Server数据库,查询远端普通表。
1、在SQL Server数据库中创建测试表并插入数据。
CREATE DATABASE YourDatabase;
USE YourDatabase; --数据库
GO
CREATE TABLE remote_table (id INT PRIMARY KEY, year INT, data NVARCHAR(100), amount DECIMAL(10, 2));
GO
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);
GO
2、在Vastbase数据库重创建server mapping。
CREATE SERVER sqlserver_new
FOREIGN DATA WRAPPER tds_fdw
OPTIONS(
servername '172.16.100.23', --替换为sql server所在的host,也可以填ip,请根据实际情况自行修改;
port '1433', --- sqlserver的默认端口号;
database 'YourDatabase', --在sql server中创建的数据库名;
tds_version '7.4' --固定值;
);
3、在Vastbase数据库中创建user mapping。
CREATE USER MAPPING FOR user -- user是Vastbase数据库的用户名,需要按实际情况填写;
SERVER sqlserver_new
OPTIONS (username 'sa', password 'Niu24680@'); -- sa是sql server的默认系统管理员,密码在安装sql server的时候设置;
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: 数据库远程访问SQL Server数据库,调用存储过程。
1、在SQL Server数据库中创建测试表并插入数据。
CREATE DATABASE test_db;
USE test_db; -- 数据库名;
GO
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');
GO
2、在Vastbase数据库中创建server mapping。
CREATE SERVER sqlserver_new
FOREIGN DATA WRAPPER tds_fdw
OPTIONS(
servername '172.16.100.23', --替换为sql server所在的host,也可以填ip,请根据实际情况自行修改;
port '1433', --- sql server的默认端口号;
database 'YourDatabase', --在sql server中创建的数据库名;
tds_version '7.4' --固定值;
);
3、在Vastbase数据库中创建user mapping。
CREATE USER MAPPING FOR user -- user是Vastbase数据库的用户名,需要按实际情况填写;
SERVER sqlserver_new
OPTIONS (username 'sa', password 'Niu24680@'); -- sa是sql server的默认系统管理员,密码在安装sql server的时候设置;
4、在Vastbase数据库中创建外表。
CREATE FOREIGN TABLE Students (
id INT,
name VARCHAR(50),
age INT,
grade VARCHAR(10)
) SERVER sqlserver_new
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 8 at FOR over SELECT rows
CONTEXT: tds_fdw: Getting results
CONTEXT: PL/pgSQL function public.spl() line 8 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,age:19,grade:A
NOTICE : id:4,name:John,age:21,grade:C
NOTICE : id:5,name:Emma,age:20,grade:B
NOTICE : id:6,name:Sophia,age:19,grade:A
sp1
------
(1 row)