每当表执行插入或更新时,我都试图找到从Server 2014和2017复制数据的方法。我试图实时地将这些值插入到PostgreSQL中的另一个表中。我探索过的几个选项是使用诸如以下工具的批处理:
我不知道如何实时地从SQL服务器获取事件,这样我就可以链接到Kafka之类的东西,甚至是Python微服务之类的东西,或者是否有更好的方法。
发布于 2019-03-24 13:26:03
使用触发器
创建Server & Postgresql表:
-- SQL Server
create table test (id int identity(1,1) not null primary key, name varchar(25), description varchar(1000))
go
-- Postgresql:
CREATE TABLE public.test
(
id integer,
name character varying(25) COLLATE pg_catalog."default",
description character varying(1000) COLLATE pg_catalog."default"
)
在server中创建到Postgresql服务器的链接服务器。 然后在Server表上创建触发器:
create trigger iu_trigger_name on test
after insert, update
as
begin
UPDATE [SQLAuth_PG].[DefaultDB].[public].[test]
SET name = t.name, description = t.description
FROM [SQLAuth_PG].[DefaultDB].[public].[test] p
INNER JOIN inserted t ON p.id = t.id
INSERT INTO [SQLAuth_PG].[DefaultDB].[public].[test]
([id]
,[name]
,[description])
SELECT t.id, t.name, t.description
FROM inserted t
WHERE NOT EXISTS (
SELECT * FROM [SQLAuth_PG].[DefaultDB].[public].[test]
WHERE id = t.id
)
end
go
create trigger d_trigger_name on test
after delete
as
begin
delete p
FROM [SQLAuth_PG].[DefaultDB].[public].[test] p
inner join deleted d on p.id = d.id
end
go
测试:
insert into test (name, description) select 'Name1', 'Name 1 description'
go
select * from [SQLAuth_PG].[DefaultDB].[public].[test]
--output
--id name description
--1 Name1 Name 1 description
update test set description = 'Updated description!' where name = 'Name1'
go
select * from [SQLAuth_PG].[DefaultDB].[public].[test]
-- output
--id name description
--1 Name1 Updated description!
delete from test
go
select * from [SQLAuth_PG].[DefaultDB].[public].[test]
go
-- postgresql table is empty
此示例中的触发器处理批处理插入和更新。这是触发器唯一真正的陷阱-假设“插入”表中只有一条记录。大容量插入或更新之后,插入的表将填充所有新的/修改的记录。
发布于 2019-03-25 09:38:01
如果您想走Kafka路线,有几个选项可以将数据从SQL Server中获取到Kafka中:
- [Debezium](https://www.confluent.io/connector/debezium-sql-server-cdc-connector/)
- [kafka-connect-cdc-microsoft-sql](https://www.confluent.io/connector/kafka-connect-cdc-microsoft-sql/)
- Plus Attunity, Goldengate, et al
- [kafka-connect-jdbc](https://www.confluent.io/connector/kafka-connect-jdbc/) Source
一旦数据在Kafka中,您就可以使用卡夫卡连接-jdbc Sink将其流到Postgres (或任何其他数据库)。
https://stackoverflow.com/questions/55320827
复制相似问题