Согласование столбца в двух таблицах в SQL Server

Есть две базы данных, в базе данных A есть таблица A со столбцами id, group и flag. В базе данных B есть таблица B со столбцами идентификаторов и флагов. Таблица B по существу является подмножеством таблицы A where the group == 'B'.

Они обновляются / создаются странными способами, которые находятся вне моего понимания в настоящее время и выходят за рамки этого вопроса (сейчас не время исправлять базовые настройки и методы этого клиента).

Проблема в том, что когда флаг в таблице A обновляется, он не отражается в таблице B, но должен быть. Это не критичная по времени проблема, поэтому мне было предложено создать задание для ее решения. Может быть, потому что это конец недели, или, может быть, потому, что я никогда не писал больше, чем самая простая хранимая процедура (я программист, а не администратор базы данных), но я не уверен, как это сделать.

На упрощенном уровне хранимая процедура будет чем-то вроде

Select * in table A where group == B

Затем прокрутите resultset и обновите флаг для каждого идентификатора.

Но я даже не знаю, как вот так зациклить stored procedure. Предложения? Пример кода был бы предпочтительнее.

Осложнение: Хорошо, это тоже становится немного сложнее. Для каждой группы таблица B находится в отдельной базе данных, и нам нужно обновить этот флаг для всех групп. Таким образом, нам пришлось бы настроить отдельный триггер для каждой группы для обработки каждого имени БД.

И да, вставки в Таблицу B уже обработаны - это просто для обновления статуса флага.

Похоже, что есть аналогичный вопрос на stackoverflow.com/questions/149132/…, но он останавливается на шаг впереди того, что я хочу выполнить.

Chris Boylan 18.10.2008 06:41

Я просто перечитал связанный вопрос; как бы вы описали следующий шаг, которого не хватает в вашей ситуации? Вы спрашиваете, как использовать курсоры (которые не разрешены в связанном вопросе)? Каков масштаб этой проблемы, т.е. сколько строк в таблице A?

Matt 18.10.2008 08:02

В настоящее время 2 млн. Я ожидал, что это будет ежегодное количество добавляемых строк.

Chris Boylan 18.10.2008 08:37

Что касается следующего шага, возможно, я просто слишком много обдумываю. Ваш ответ может помочь. Узнаю завтра, когда проснется админ сервера.

Chris Boylan 18.10.2008 08:39

Это по неизвестным мне причинам больше не рассматривается, поэтому я не могу сказать, какой ответ был лучшим, поскольку он никогда не был реализован. Извиняюсь.

Chris Boylan 23.10.2008 00:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
5
2 890
3

Ответы 3

Создайте триггер обновления для таблицы A, который подталкивает необходимые изменения к B по мере изменения A.

В принципе (синтаксис может быть некорректным, сейчас я не могу это проверить). Кажется, я помню, что вставленная таблица содержит все обновленные строки при обновлении, но вы можете проверить это, чтобы убедиться. Я думаю, что спусковой крючок - это то, что нужно.

create trigger update_b_trigger
on Table_A
for update
as
begin
   update Table_B
   set Table_B.flag = inserted.flag
   from inserted
          inner join Table_B
             on inserted.id = Table_B.id 
                 and inserted.group = 'B'
                 and inserted.flag <> Table_B.flag
end

[РЕДАКТИРОВАТЬ] Я предполагаю, что операции вставки / удаления в Таблицу B уже выполнены, и это всего лишь отметка об обновлениях Таблицы B, которые необходимо решить.

Хорошо, похоже, это сработает для любых новых обновлений, но базы данных сейчас не синхронизированы. Кроме того, создаст ли создание 20-30 триггеров (по одному для каждой группы / БД) проблемы с производительностью?

Chris Boylan 18.10.2008 07:33

Предполагая, что идентификатор является уникальным ключом и что вы можете использовать связанные серверы или что-то подобное для выполнения запроса между серверами, этот оператор SQL должен работать (он работает для двух таблиц на одном сервере).

UPDATE Table_B
SET Table_B.Flag = Table_A.Flag
FROM Table_A inner join Table_B on Table_A.id = Table_B.id

(поскольку Table_B уже содержит подмножество строк из Table_A, где group = B, нам не нужно включать это условие в наш запрос)

Если вы не можете использовать связанные серверы, я могу попробовать сделать это с помощью какого-нибудь пакета SSIS. Или я бы использовал метод, описанный в связанный вопрос (комментарии, выше), чтобы получить соответствующие данные из базы данных A во временную таблицу и т. д. В базе данных B, а затем выполнить этот запрос с использованием временной таблицы.

UPDATE 
  DatabaseB.dbo.Table_B
SET 
  DatabaseB.dbo.Table_B.[Flag] = DatabaseA.dbo.Table_A.Flag
FROM 
  DatabaseA.dbo.Table_A inner join DatabaseB.dbo.Table_B B 
  on DatabaseA.dbo.id = DatabaseB.dbo.B.id

Осложнение: Для нескольких групп запустите один такой SQL-запрос обновления для каждой группы.

Обратите внимание, что вы можете использовать Flag без []. Я использую скобки только из-за раскраски синтаксиса в stackoverflow.

Другие вопросы по теме