Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация данных в таблицах (триггеры) / 5 сообщений из 5, страница 1 из 1
02.12.2020, 21:21
    #40024065
Синхронизация данных в таблицах (триггеры)
День добрый!

Есть задача синхронизировать данные между двумя таблицами, в обе стороны!

Поясняю:
Есть Таблица1 в ней Триггер1 и Триггер2
При изменении данных в Таблице1 в Триггере1 выполняются операции по обновлению данных в Таблице2
В Таблице2 так же есть Триггер1 и Триггер2. При изменении данных должен срабатывать Триггер2 и вносить изменения в Таблицу1.

Естественно возникает зацикливание и отвал по ошибке.
Можно ли сделать так, что бы например, при срабатывании Триггера2 в Таблице2 не вызывался Триггер1 из Таблицы1 и наоборот. Другие триггеры должны отрабатывать.

Или каким-то другим способом реализовать задачу.

По сути нужно обеспечить двустороннюю синхронизацию данных. Но поля и данные в таблицах не идентичны, в триггерах производятся некие преобразования.

Спасибо!
...
Рейтинг: 0 / 0
02.12.2020, 21:55
    #40024074
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация данных в таблицах (триггеры)
Как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
use tempdb;
go

create table dbo.t1 (id int primary key, a int);
create table dbo.t2 (id int primary key, a int);
go

create trigger dbo.tr_t1
on dbo.t1
after insert, update, delete
as
begin
 set nocount on;

 if object_id('tempdb..#tr_t2', 'U') is not null
  return;

 create table #tr_t1 (dummy int);

 with s (id, a, is_deleted) as
 (
  select
   isnull(i.id, d.id), i.a, case when i.id is null then 1 else 0 end
  from
   inserted i full join
   deleted d on d.id = i.id
 )
 merge into dbo.t2 t
 using s on s.id = t.id
 when not matched then
  insert
   (id, a)
  values
   (s.id, s.a)
 when matched and s.is_deleted = 0 then
  update
   set a = s.a
 when matched and s.is_deleted = 1 then
  delete;
end;
go

create trigger dbo.tr_t2
on dbo.t2
after insert, update, delete
as
begin
 set nocount on;

 if object_id('tempdb..#tr_t1', 'U') is not null
  return;

 create table #tr_t2 (dummy int);

 with s (id, a, is_deleted) as
 (
  select
   isnull(i.id, d.id), i.a, case when i.id is null then 1 else 0 end
  from
   inserted i full join
   deleted d on d.id = i.id
 )
 merge into dbo.t1 t
 using s on s.id = t.id
 when not matched then
  insert
   (id, a)
  values
   (s.id, s.a)
 when matched and s.is_deleted = 0 then
  update
   set a = s.a
 when matched and s.is_deleted = 1 then
  delete;
end;
go

insert into dbo.t1 values (1, 1);
insert into dbo.t2 values (2, 2);

select * from dbo.t1;
select * from dbo.t2;
go

drop table dbo.t1, dbo.t2;
go

...
Рейтинг: 0 / 0
02.12.2020, 22:12
    #40024082
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация данных в таблицах (триггеры)
Соколов Валерий,

такие вещи поручают процедурам, а не триггерам.
...
Рейтинг: 0 / 0
03.12.2020, 09:58
    #40024151
Тяп-ляп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация данных в таблицах (триггеры)
CONTEXT_INFO еще можно использовать.
...
Рейтинг: 0 / 0
03.12.2020, 10:58
    #40024163
Синхронизация данных в таблицах (триггеры)
Тяп-ляп,
invm

Спасибо большое! Принцип понял!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация данных в таблицах (триггеры) / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]