首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实时更新Server的好方法是什么?

实时更新Server的好方法是什么?
EN

Stack Overflow用户
提问于 2019-03-24 04:50:28
回答 2查看 121关注 0票数 1

每当表执行插入或更新时,我都试图找到从Server 2014和2017复制数据的方法。我试图实时地将这些值插入到PostgreSQL中的另一个表中。我探索过的几个选项是使用诸如以下工具的批处理:

  • Talend ETL工具
  • PostgreSQL中的外部数据包装器,它使用cron作业触发使用Server表中的数据每小时插入和更新PostgreSQL表的过程。

我不知道如何实时地从SQL服务器获取事件,这样我就可以链接到Kafka之类的东西,甚至是Python微服务之类的东西,或者是否有更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-24 13:26:03

使用触发器

创建Server & Postgresql表:

代码语言:javascript
运行
复制
-- 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表上创建触发器:

代码语言:javascript
运行
复制
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

测试:

代码语言:javascript
运行
复制
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

此示例中的触发器处理批处理插入和更新。这是触发器唯一真正的陷阱-假设“插入”表中只有一条记录。大容量插入或更新之后,插入的表将填充所有新的/修改的记录。

票数 3
EN

Stack Overflow用户

发布于 2019-03-25 09:38:01

如果您想走Kafka路线,有几个选项可以将数据从SQL Server中获取到Kafka中:

  • 对于基于日志的CDC:
代码语言:javascript
运行
复制
- [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

  • 对于基于查询的CDC:
代码语言:javascript
运行
复制
- [kafka-connect-jdbc](https://www.confluent.io/connector/kafka-connect-jdbc/) Source

一旦数据在Kafka中,您就可以使用卡夫卡连接-jdbc Sink将其流到Postgres (或任何其他数据库)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55320827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档