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)