WedX - журнал о программировании и компьютерных науках

SQL Server: захват всех измененных столбцов в отдельной таблице

На моем сервере SQl есть таблица из 40 атрибутов / столбцов. Существует ежедневная нагрузка, которая может обновлять любой из этих столбцов. Я хочу зафиксировать изменения в этих столбцах в отдельной таблице со столбцом кода причины, указывающим, какое значение столбца изменилось. Могут быть случаи, когда более чем одно значение столбца может быть изменено за одну ежедневную загрузку, в этом случае измененная таблица журнала должна фиксировать все эти изменения отдельно в строках, где каждая строка отображает отдельное изменение.

Например:

ТаблицаA (столбец1 (pk), столбец2, столбец3, столбец4) значения (1,100, ABC, 999)

После обновления:

ТаблицаA (столбец1 (pk), столбец2, столбец3, столбец4)

значения (1,100, ACD, 901)

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

TabChangeLog (столбец1, до, после, причина);

значения (1, ABC, ACD, 'столбец3 изменен')

значения (1,999,901, 'столбец4 изменен')

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

26.02.2019

Ответы:


1

Вам нужно создать такой триггер:

create trigger trigger_name
instead of update as

if update(column1)
begin
insert into TabChangeLog
select inserted.column1, inserted.column3, deleted.column3, 'column3', 'update/change'
from inserted i inner join deleted d 
on i.column1 = d.column2
end

if update(column2)
begin
insert into TabChangeLog
select inserted.column1, inserted.column2, deleted.column2, 'column2', 'update/change'
from inserted i inner join deleted d 
on i.column1 = d.column2
end
...

https://www.tutorialgateway.org/instead-of-update-triggers-in-sql-server/

26.02.2019

2

В Microsoft SQL Server 2016 есть функция, называемая темпоральными таблицами, которая, вероятно, значительно упростит вашу работу. Это позволяет вам перематывать набор данных во времени, чтобы увидеть изменения:

https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017

Если вы не хотите идти по этому пути, используйте вместо этого триггеры. У триггеров UPDATE есть две таблицы inserted и deleted, которые позволяют узнать, какое состояние строки было до и после.

* Изменить: это таблицы, поэтому вы должны использовать SELECT INTO и т. Д., Чтобы взаимодействовать с ними, вы не можете выполнять условную логику (if / else)

CREATE TABLE [dbo].[Table1](
    [Id] [int] NOT NULL,
    [Tail] [int] NOT NULL,
 CONSTRAINT [PK_Table1_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
)


CREATE TABLE Table1_Audit
(
Audit varchar(100)
)

--drop trigger Table1_OnUPDATE

CREATE TRIGGER Table1_OnUPDATE 
   ON  dbo.Table1
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here

    INSERT INTO Table1_Audit ([Audit])
    select CONCAT('Tail changed to' ,inserted.Tail,' for pk Id=',inserted.Id) from inserted inner join
    deleted on inserted.Id = deleted.Id  --pk must be the same
    where
    inserted.Tail <> deleted.Tail --field x must be different

END
GO

--truncate table Table1_Audit

--update Table1 set Tail = 5

select * from Table1_Audit
26.02.2019
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]