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