powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация данных в таблицах (триггеры)
5 сообщений из 5, страница 1 из 1
Синхронизация данных в таблицах (триггеры)
    #40024065
День добрый!

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

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

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

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

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

Спасибо!
...
Рейтинг: 0 / 0
Синхронизация данных в таблицах (триггеры)
    #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
Синхронизация данных в таблицах (триггеры)
    #40024082
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколов Валерий,

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

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


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