Триггер обновления после вставки старых записей в другую таблицу - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть таблица MedicalAllowance. Я хочу сделать из этой таблицы vesrion как таблицу истории "MedicalAllowanceHistory". Я хочу создать триггер, чтобы сделать это после обновления таблицы MedicalAllowance, скопировать данные в таблицу "MedicalAllowanceHistory". Какой способ лучше сделать?

Таблица медицинского пособия

ID | Employee_ID | Limit | Used | Balance

Таблица медицинского пособияИстория

ID | Employee_ID | Limit | Used | Balance

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

вы можете использовать триггер для этого
Но я бы также сохранил дату события и тип события (вставка, обновление или удаление)
Вот пример, с которого можно начать

CREATE trigger tr_UID_MedicalAllowance on dbo.MedicalAllowance
after update, insert, delete
as
begin
    set nocount on

    declare @Insert bit = 0
    declare @Update bit = 0
    declare @Delete bit = 0

    --find out why we where triggered
    if (exists(select 1 from inserted)) and (exists(select 1 from deleted))
        set @Update = 1
    else if (exists(select 1 from inserted))
        set @Insert = 1
    else if (exists (select 1 from deleted))
        set @Delete = 1

    if @Update = 1
    begin
         insert into MedicalAllowanceHistory (
                     MedicalAllowanceID, 
                     HistoryDate, 
                     HistoryEvent, 
                     other columns...)
         select i.MedicalAllowanceID,
                getdate(),
                'UPDATED',
                i.other columns...
         from   inserted i
    end

    if @Insert = 1
    begin
         insert into MedicalAllowanceHistory (
                     MedicalAllowanceID, 
                     HistoryDate, 
                     HistoryEvent, 
                     other columns...)
         select i.MedicalAllowanceID,
                getdate(),
                'INSERTED',
                i.other columns...
         from   inserted i
    end

    if @Delete = 1
    begin
         insert into MedicalAllowanceHistory (
                     MedicalAllowanceID, 
                     HistoryDate, 
                     HistoryEvent, 
                     other columns...)
         select d.MedicalAllowanceID,
                getdate(),
                'DELETED',
                d.other columns...
         from   deleted d
    end
end

Также возможно сохранить старые и новые значения в случае обновления, новые значения находятся в таблице inserted, а старые - в таблице deleted.
В этом случае update часть может выглядеть примерно так

if @Update = 1
begin
     insert into MedicalAllowanceHistory (
                 MedicalAllowanceID, 
                 HistoryDate, 
                 HistoryEvent, 

                 NewLimit,
                 OldLimit,

                 other columns...)
     select i.MedicalAllowanceID,
            getdate(),
            'UPDATED',

            i.Limit,
            d.Limit,

            other columns...
     from   inserted i
       inner join deleted d on i.MedicalAllowanceID = d.MedicalAllowanceID
end
0 голосов
/ 27 сентября 2018

Я предлагаю вам использовать «Изменить сбор данных» вместо «Триггер».В этом решении SQL отслеживает любые изменения.Если вам нужно больше узнать об этом, нажмите здесь .

0 голосов
/ 27 сентября 2018

Вы можете использовать следующий пример для решения вашей проблемы:

CREATE TRIGGER tg_MedicalAllowance ON MedicalAllowance
AFTER UPDATE, INSERT, DELETE
AS
BEGIN
  INSERT MedicalAllowanceHistory
  SELECT ID,Employee_ID,Limit,Used,balance
  FROM deleted
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...