suneel kumar gupta Ответов: 2

Вставьте старые данные вместе с новыми данными в виде data_log в случае обновления табличных данных


У меня есть столик
TABLE-  EMP_TABLE

EMP_ID                 FIRST_NAME          LAST_NAME              MOBILE_NO
101                     Sunil                Gupta                98989899989
Я обновляю таблицу EMP_TABLE, присоединяясь к нижеприведенной таблице

ТАБЛИЦА - TEMP_DATA
EMP_ID            FIRST_NAME            LAST_NAME                MOBILE_NO
101                Sunil                SINGH                   9989887211

UPDATE EMP SET EMP.FIRST_NAME=T.FIRST_NAME,EMP.LAST_NAME=T.LAST_NAME,EMP.MOBILE_NO=T.MOBILE_NO
FROM EMP_TABLE EMP
INNER JOIN TEMP_DATA T ON T.EMP_ID=EMP.EMP_ID
Но перед обновлением значения я хочу записать старое и новое значение в таблицу--
DATA_LOG
-----------------------------------------------------------------------------------
ID      EMP_ID       FIELD_NAME        TABLE_NAME      OLD_VALUE         NEW_VALUE
-------------------------------------------------------------------------------------
1        101          FIRST_NAME        EMP_TABLE       Sunil            Sunil
2        101          LAST_NAME         EMP_TABLE       Gupta            Singh
3        101          MOBILE_NO         EMP_TABLE       98989899989      9989887211
Вышеописанные детали это всего лишь пример таблицы DATA_LOG являются универсальной таблицей в которой хранятся все множественные данные data store в случае процесса обновления данных

Пожалуйста, предложите лучший способ вставки данных в таблицу DATA_LOG.

Что я уже пробовал:

Я пробовал использовать UNPIVOT, но не получил реального решения---
SELECT FieldName,OLDVALUE,NewValue 
			FROM
			(
              select 
              T.FIRST_NAME  'FIRST_NAME',
              T.MIDDLE_NAME  'MIDDLE_NAME',
              T.LAST_NAME  'LAST_NAME',
              T.CARE_OF_NAME 'CARE_OF_NAME',
              T.GENDER 'GENDER',
              T.CONNECTION_HOUSE_NO 'CONNECTION_HOUSE_NO',
              T.CONNECTION_STREET_NO 'CONNECTION_STREET_NO',
              T.CONNECTION_CITY 'CONNECTION_CITY'
              from #TEMPDATA  T
              
   )P
   --INNER JOIN JVVNL_CRM.CRM.CONSUMERS C ON C.K_NO='210111032566'
   UNPIVOT(OLDVALUE,NewValue  FOR FieldName  IN 
				 (p.FIRST_NAME,p.MIDDLE_NAME,p.LAST_NAME,p.CARE_OF_NAME,p.GENDER,p.CONNECTION_HOUSE_NO,p.CONNECTION_STREET_NO,p.CONNECTION_CITY)
			)AS unpvt;

ZurdoDev

Похоже, вам нужен триггер аудита.

suneel kumar gupta

Таблица Data_Logs это общая таблица в которой если мы хотим обновить данные таблицы если это необходимо то сохраняем старые значения в таблице журнала данных

Santosh kumar Pithani

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

2 Ответов

Рейтинг:
1

Santosh kumar Pithani

Если вы используете выше 2008 сервер , я предлагаю включить CDC(change Data capture) на таблице.Ниже приведена ссылка..

[^]

У меня есть еще один ответ, но он только для идеи...

CREATE TABLE #EMP_TABLE
(
EMP_ID  INT , FIRST_NAME VARCHAR(50),LAST_NAME VARCHAR(50),MOBILE_NO VARCHAR(50)
)
INSERT INTO #EMP_TABLE 
VALUES (101 ,'Santosh','kumar','8985589046');

CREATE TABLE #TEMP_DATA
(
EMP_ID  INT , FIRST_NAME VARCHAR(50),LAST_NAME VARCHAR(50),MOBILE_NO VARCHAR(50)
)
INSERT INTO #TEMP_DATA 
VALUES(101 ,'Sunil ','SINGH','9989887211');

CREATE TABLE #DATA_LOG  -- table for inserting  new and old records.
(
Id int IDENTITY(1,1),Emp_id INT,Table_name VARCHAR(50),FLd_Old_New  VARCHAR(MAX),Modify_Date Datetime
)


UPDATE EMP SET EMP.FIRST_NAME=T.FIRST_NAME,EMP.MOBILE_NO=T.MOBILE_NO
OUTPUT 
inserted.EMP_ID,N'#EMP_TABLE',
'FIRST_NAME:'+deleted.FIRST_NAME+'->'+Inserted.FIRST_NAME+space(2)+
'MOBILE_NO:'+Deleted.MOBILE_NO+'->'+Inserted.MOBILE_NO ,GETDATE()
INTO  #DATA_LOG
FROM #EMP_TABLE EMP
INNER JOIN #TEMP_DATA T ON T.EMP_ID=EMP.EMP_ID 
                                             
select * from #DATA_LOG
OUTPUT :-
Id | Emp_id | Table_name | FLd_Old_New |	Modify_Date
1    101     #EMP_TABLE	  FIRST_NAME:Santosh->Sunil   MOBILE_NO:8985589046->9989887211	2018-09-12 10:28:36.563


Рейтинг:
0

CHill60

Не знаю, почему вы думаете, что какая-то случайная техника, такая как UNPIVOT, будет проверять вашу таблицу для вас. Как указано в комментариях @011111100010, похоже, вам нужен триггер аудита - вот учебник, который покажет вам, как это сделать Создайте простой триггер SQL Server для построения журнала аудита[^]

Ваша мотивация для этого не ясна, поэтому, возможно, Вам также следует ознакомиться с Как читать журнал транзакций базы данных SQL Server[^]

Если вы решите сделать это вручную, то вам придется сделать что-то вроде этого

INSERT INTO DATA_LOG (EMP_ID, FIELD_NAME, TABLE_NAME, OLD_VALUE, NEW_VALUE)
SELECT EMP.EMP_ID, 'FIRST_NAME', 'EMP_TABLE', EMP.FIRST_NAME AS OLD_VALUE, T.FIRST_NAME AS NEW_VALUE

INSERT INTO DATA_LOG (EMP_ID, FIELD_NAME, TABLE_NAME, OLD_VALUE, NEW_VALUE)
SELECT EMP.EMP_ID, 'LAST_NAME', 'EMP_TABLE', EMP.LAST_NAME AS OLD_VALUE, T.LAST_NAME AS NEW_VALUE

INSERT INTO DATA_LOG (EMP_ID, FIELD_NAME, TABLE_NAME, OLD_VALUE, NEW_VALUE)
SELECT EMP.EMP_ID, 'MOBILE_NO', 'EMP_TABLE', EMP.MOBILE_NO AS OLD_VALUE, T.MOBILE_NO AS NEW_VALUE
(предполагая, что идентификатор является столбцом идентификаторов) Действительно ужасно, и лучший аргумент, который я мог бы привести для использования триггера вместо этого.

Кстати, если вы проводите аудит, не кажется ли вам, что было бы неплохо также зафиксировать дату-время изменения и, возможно, кто это сделал? Если пространство является премиальным, то зачем беспокоиться о сохранении нового значения в таблице аудита - это будет либо значение, находящееся в данный момент в таблице EMP_TABLE, либо OLD_VALUE, хранящееся в следующем журнале аудита для этого EMP_ID.

Наконец, я верю, что TEMP_DATA содержит только те значения, которые вы определенно хотите изменить в EMP_TABLE, поскольку вы опустили любое предложение WHERE.


suneel kumar gupta

Я согласен с вами но Data_Log содержит данные из нескольких исходных таблиц а не для таблицы for EMP,

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

CHill60

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