Как я могу автоматически создавать сценарии обновления sql при обновлении некоторых данных? - PullRequest
0 голосов
/ 05 мая 2010

Я хотел бы автоматически генерировать скрипт обновления каждый раз, когда значение изменяется в моей базе данных. Другими словами, если хранимая процедура или запрос обновляет столбец a со значением b в таблице c (который является столбцом pk (i, j ... k), я хочу сгенерировать это:

update c set a=b where i=... and j=... and k=...

и сохраните его где-нибудь (например, в виде необработанной строки в таблице). Чтобы усложнить ситуацию, я хочу, чтобы сценарий создавался только в том случае, если обновление было выполнено конкретным пользователем. Хорошей новостью является то, что у меня есть первичный ключ, определенный для всех моих таблиц.

Я вижу, как это сделать, используя триггер, но мне нужно было бы генерировать конкретные триггеры для каждой таблицы и обновлять их каждый раз, когда моя схема изменяется.

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

Меня также интересуют способы автоматической генерации триггеров (возможно, с использованием триггеров - мета-триггеров, да? - поскольку мне нужно будет автоматически обновлять триггеры при изменении схемы)


Вот почему я хочу это сделать. У меня есть производственная база данных A и база данных хранилища данных B. Я использую транзакционную репликацию для синхронизации баз данных. Мне нужно иметь возможность обновлять некоторые значения в хранилище данных без обновления производственной базы данных. Это прекрасно работает с репликацией транзакций, но поднимает две проблемы, которые приводят к вышеуказанному вопросу:

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

1 Ответ

0 голосов
/ 05 мая 2010

Вместо того чтобы думать в терминах сценария обновления данных, почему бы не сохранить данные, которые изменились?

Таблицы истории, заполненные триггером, хороши для этого, поскольку каждое изменение записывает новую строку в таблицу истории, записывая дату / время изменения, а также пользователя, выполняющего изменение.

Таблица истории будет такой же, как и исходная таблица, с добавлением следующих столбцов (конечно, используйте ваше собственное соглашение об именах):

update_date datetime DEFAULT CURRENT_TIMESTAMP
update_by_user varchar(100) DEFAULT SYSTEM_USER

Затем вы создаете триггер на вашей таблице для ОБНОВЛЕНИЯ на вашей базовой таблице:

CREATE TRIGGER MyTable_Record_Changes
   ON MyTable
   AFTER UPDATE
AS 
BEGIN
    INSERT [MyTable_History] ([col_1], [col_2], ...)
    SELECT [col_1], [col_2], ...
    FROM deleted
END

Теперь у вас есть полная история изменений, внесенных в ваши данные, когда и кем. Затем вы можете принять эти изменения и при необходимости сравнить / обновить другую базу данных.

...