Что может быть хорошим способом получения обновлений SQL Server в режиме реального времени? - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь найти способ копировать данные из SQL Server 2014 и 2017 каждый раз, когда в таблицу выполняется вставка или обновление. Я пытаюсь сделать это в режиме реального времени, чтобы вставить эти значения в другую таблицу в PostgreSQL. Несколько вариантов, которые я исследовал, - это пакетная обработка с использованием таких инструментов, как:

  • Инструмент Talend ETL

  • Оболочки внешних данных в PostgreSQL, использующие задание cron для запуска процедуры, которые делают ежечасные вставки и обновления таблицы PostgreSQL используя данные из таблицы SQL Server.

Я не уверен, как в реальном времени получать события от SQL-сервера, которые я могу связать с чем-то вроде Kafka или даже чем-то вроде микросервиса Python или, если есть лучший способ.

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Использование триггеров

Создание таблиц SQL 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"
)

Создание связанного сервера в SQL Server с вашим сервером Postgresql.

Затем создайте триггеры в своей таблице SQL 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

Триггер в этом примере обрабатывает пакетные вставкии обновления.Это единственная настоящая ошибка с триггерами - при условии, что в «вставленной» таблице есть только одна запись.После массовой вставки или обновления вставленная таблица заполняется всеми новыми / измененными записями.

1 голос
/ 25 марта 2019

Если вы хотите пойти по пути Kafka, есть несколько вариантов получения данных из SQL Server в Kafka:

Как только данные в Kafka, вы можете передавать их в Postgres (или любую другую базу данных), используя kafka-connect-jdbc Sink.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...