Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Добрый день.
Пытаюсь наладить онлайн синхронизацию таблиц в разных БД. Есть БД Gateway и Gateway_Arch, в них одинаковые по структуре таблицы "orders". При появлении/изменении значений в таблице "Gateway.orders" надо добавлять такую же запись в "Gateway_Arch.orders"
С Insert-триггером проблем не возникло. А Update-триггер выдаёт ошибку
Msg 209, Level 16, State 1, Procedure trFutOrdersLog_AU, Line 8
Ambiguous column name 'replID'.

USE [Gateway]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_orders_AU]
  ON [dbo].[orders]
  AFTER UPDATE
AS 
BEGIN
  SET NOCOUNT ON;

  UPDATE [Gateway_arch].[dbo].[orders]
   SET [replID] = I.[replID]
      ,[replRev] = I.[replRev]
      ,[replAct] = I.[replAct]
      ,[id_ord] = I.[id_ord]
      ,[sess_id] = I.[sess_id]
      ,[client_code] = I.[client_code]
 FROM INSERTED I, DELETED D
 WHERE [replID] = D.[replID]
      AND [replRev] = D.[replRev]
      AND [replAct] = D.[replAct]
      AND [id_ord] = D.[id_ord]
      AND [sess_id] = D.[sess_id]
      AND [client_code] = D.[client_code]
END

Как поправить и правильно ли делаю вообще, по задумке?
----------
Delphi7 + MSSQL2005 + DevExpress
2 авг 11, 17:26    [11060532]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
Как поправить

Взять за привычку имена полей указавать вместе с именем таблицы/алиаса
2 авг 11, 17:28    [11060545]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
FROM INSERTED I, DELETED D
 WHERE [replID] = D.[replID]
      AND [replRev] = D.[replRev]
      AND [replAct] = D.[replAct]
      AND [id_ord] = D.[id_ord]
      AND [sess_id] = D.[sess_id]
      AND [client_code] = D.[client_code]

У вас это уникальный ключ что ли указан в WHERE ?
2 авг 11, 17:30    [11060557]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory,

Если так начинать
UPDATE [Gateway_arch].[dbo].[orders] R
   SET R.[replID] = I.[replID]
то ошибка
Msg 170, Level 15, State 1, Procedure trFutOrdersLog_AU, Line 8
Line 8: Incorrect syntax near 'R'.

Понимаю, что проблема в мелочи какой-то, но чтот не догоняю.

Glory
У вас это уникальный ключ что ли указан в WHERE ?

нет )))
2 авг 11, 17:35    [11060593]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор

Понимаю, что проблема в мелочи какой-то, но чтот не догоняю.

В SET и так слева можно указать только столбцы одной таблицы. В отличии от WHERE

Федор
Glory
У вас это уникальный ключ что ли указан в WHERE ?

нет )))

Тогда почему все эти поля участвуют в соединении ?
2 авг 11, 17:38    [11060616]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Федор,

 WHERE [Gateway_arch].[dbo].[orders].[replID] = D.[replID]
      AND [Gateway_arch].[dbo].[orders].[replRev] = D.[replRev]
      AND [Gateway_arch].[dbo].[orders].[replAct] = D.[replAct]
      AND [Gateway_arch].[dbo].[orders].[id_ord] = D.[id_ord]
      AND [Gateway_arch].[dbo].[orders].[sess_id] = D.[sess_id]
      AND [Gateway_arch].[dbo].[orders].[client_code] = D.[client_code]
2 авг 11, 17:41    [11060640]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory
В SET и так слева можно указать только столбцы одной таблицы. В отличии от WHERE

Спасибо, дошло

[/quot]Тогда почему все эти поля участвуют в соединении ?[/quot]
В таблице нет PK. (Не спрашивайте почему, не я это придумал. Структура таблицы определяется внешним поставщиком)
2 авг 11, 17:45    [11060659]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
В таблице нет PK. (Не спрашивайте почему, не я это придумал. Структура таблицы определяется внешним поставщиком)

А как вы тогда собрались различать записи между собой ?
2 авг 11, 17:46    [11060671]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
ilyaBS,

Да, спасибо, именно так и сделал, правда через алиас, ибо длинно

FROM INSERTED I, DELETED D, [Gateway_arch].[dbo].[orders] R
 WHERE R.[replID] = D.[replID]
      AND R.[replRev] = D.[replRev]
      AND R.[replAct] = D.[replAct]
      AND R.[id_ord] = D.[id_ord]
      AND R.[sess_id] = D.[sess_id]
      AND R.[client_code] = D.[client_code]
2 авг 11, 17:48    [11060687]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
ilyaBS,

Да, спасибо, именно так и сделал, правда через алиас, ибо длинно

FROM INSERTED I, DELETED D, [Gateway_arch].[dbo].[orders] R
 WHERE R.[replID] = D.[replID]
      AND R.[replRev] = D.[replRev]
      AND R.[replAct] = D.[replAct]
      AND R.[id_ord] = D.[id_ord]
      AND R.[sess_id] = D.[sess_id]
      AND R.[client_code] = D.[client_code]

Мне просто интересно
Вот я меняю поле client_code и что будет делать ваш запрос ?
2 авг 11, 17:50    [11060697]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory
А как вы тогда собрались различать записи между собой ?

Имеется обоснованная надежда, что в таблице нет совпадающих записей
2 авг 11, 17:50    [11060699]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Федор,

О! Я не знал, что так можно. Теперь и я стал богаче) Спасибо!
2 авг 11, 17:51    [11060707]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62908
Ну и что, если меняется одно поле, то уже не определить. Надо вводить ПК
2 авг 11, 17:51    [11060710]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory, Anatoly Podgoretsky,
Ну я рассуждаю так:
Есть триггер к [Gateway]
  UPDATE [Gateway_arch].[dbo].[orders]
   SET [replID] = I.[replID]
      ,[replRev] = I.[replRev]
      ,[replAct] = I.[replAct]
      ,[id_ord] = I.[id_ord]
      ,[sess_id] = I.[sess_id]
      ,[client_code] = I.[client_code]
 FROM INSERTED I, DELETED D, [Gateway_arch].[dbo].[orders] R
 WHERE R.[replID] = D.[replID]
      AND R.[replRev] = D.[replRev]
      AND R.[replAct] = D.[replAct]
      AND R.[id_ord] = D.[id_ord]
      AND R.[sess_id] = D.[sess_id]
      AND R.[client_code] = D.[client_code]
Я меняю значение [Gateway].[client_code]. Т.о. в INSERTED - строка с новым значением [client_code], в DELETED - со старым.
Поэтому
 WHERE R.[replID] = D.[replID]
      AND R.[replRev] = D.[replRev]
      AND R.[replAct] = D.[replAct]
      AND R.[id_ord] = D.[id_ord]
      AND R.[sess_id] = D.[sess_id]
      AND R.[client_code] = D.[client_code]
вернёт из [Gateway_arch].[dbo].[orders] строку со старым [client_code] и старыми (равными новым) значениями остальных полей.
такая строка (равно как и исходная) предполагается одна.
В чём не прав?
2 авг 11, 18:10    [11060843]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
вернёт из [Gateway_arch].[dbo].[orders] строку со старым [client_code] и старыми (равными новым) значениями остальных полей.
такая строка (равно как и исходная) предполагается одна.
В чём не прав?

А где условия по которым связаны в вашем запросе INSERTED I и DELETED D ?
2 авг 11, 18:13    [11060863]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory
А где условия по которым связаны в вашем запросе INSERTED I и DELETED D ?

Опять не понимаю, зачем...
Например, в [Gateway] (а стало быть и в [Gateway_arch]) есть запись
[replID] = 10
[replRev] = 20
[replAct] = 30
[id_ord] = 40
[sess_id] = 50
[client_code] = 60
Пусть в [Gateway].[client_code] меняется на 61
Значит INSERTED = [10,20,30,40,50,61], DELETED = [10,20,30,40,50,60]
Т.о. запрос превращается, по-моему, в такой:
UPDATE [Gateway_arch].[dbo].[orders]
   SET [replID] = 10
      ,[replRev] = 20
      ,[replAct] = 30
      ,[id_ord] = 40
      ,[sess_id] = 50
      ,[client_code] = 61
 FROM [Gateway_arch].[dbo].[orders] R
 WHERE R.[replID] = 10
      AND R.[replRev] = 20
      AND R.[replAct] = 30
      AND R.[id_ord] = 40
      AND R.[sess_id] = 50
      AND R.[client_code] = 60
По идее, он как раз и обновит запись в [Gateway_arch].[dbo].[orders]. Разве нет?
2 авг 11, 20:29    [11061236]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Glory
Member

Откуда:
Сообщений: 104751
Федор
По идее, он как раз и обновит запись в [Gateway_arch].[dbo].[orders]. Разве нет?

На каких знаниях базируются ваши идеи ?
select * from FROM INSERTED I, DELETED D
что по-вашему вернет ?
2 авг 11, 20:36    [11061255]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация данных онлайн  [new]
Федор
Member

Откуда: Пушкино
Сообщений: 189
Glory
select * from FROM INSERTED I, DELETED D
что по-вашему вернет ?

Полагаю, перемножение обоих таблиц. Видимо понял, о чем вы.

Я проанализировал таблицы, поле [id_ord] в принципе, должно быть уникальным. Т.е. полагается уникальным, но поставщиком БД это в его структуре не заложено. Буду соединять по нему.
Получается вот так
UPDATE [Gateway_arch].[dbo].[orders]
  SET [replID] = I.[replID]
       ,[replRev] = I.[replRev]
       ,[replAct] = I.[replAct]
       ,[id_ord] = I.[id_ord]
       ,[sess_id] = I.[sess_id]
       ,[client_code] = I.[client_code]
FROM INSERTED I, [Gateway_arch].[dbo].[orders] R
  JOIN DELETED D on (I.[id_ord] = D.[id_ord]) 
WHERE R.[id_ord] = D.[id_ord]
Это похоже на правильное?
3 авг 11, 11:48    [11063556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить