在更新表数据的情况下,将旧数据与新数据一起作为data_log插入 [英] Insert old data along with new data as data_log in case of update table data

查看:60
本文介绍了在更新表数据的情况下,将旧数据与新数据一起作为data_log插入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表

TABLE-  EMP_TABLE

EMP_ID                 FIRST_NAME          LAST_NAME              MOBILE_NO
101                     Sunil                Gupta                98989899989

我正在更新表EMP_TABLE通过在桌子下面加入



TABLE-TEMP_DATA

I am Updating table EMP_TABLE BY JOINING Below TABLE

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

But before update the value I want to log old and new value in table--
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_LOG表中插入数据的最佳方法。



我尝试了什么:



我尝试过使用UNPIVOT但没有得到实际解决方案---

Above Details is just sample table DATA_LOG are generic Table in which all multiple data data store in case of data update process

Please suggest best way to insert data in DATA_LOG table.

What I have tried:

I have tried using UNPIVOT but not get actual solution---

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;

推荐答案

不确定为什么你认为像UNPIVOT这样的随机技术会为你审核你的表。正如@ 011111100010在评论中所述,听起来你需要一个审计触发器 - 这是一个教程,将告诉你如何做到这一点创建一个简单的SQL Server触发器来构建审计跟踪 [ ^ ] br />


你这样做的动机不明确所以也许你也应该熟悉如何读取SQL Server数据库事务日志 [ ^ ]



如果您选择手动执行此操作,则必须执行某些操作e
Not sure why you think some random technique like UNPIVOT would audit your table for you. As @011111100010 stated in the comments, it sounds like you need an audit trigger - here is a tutorial that will show you how to do that Create a Simple SQL Server Trigger to Build an Audit Trail[^]

Your motivation for doing this is not clear so perhaps you should also familiarise yourself with How to read the SQL Server Database Transaction Log[^]

If you choose to do this manually then you would have to do something like this
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

(假设ID是一个标识列)真的非常糟糕,我能做的最好的论点请改为使用触发器。



顺便说一句,如果你正在进行审计,你不认为同时捕获日期时间是个好主意。变化,可能是谁做到了?如果空间非常宝贵,那么为什么还要在审计表上保留新值 - 这将是当前在EMP_TABLE上的值或存储在此EMP_ID的下一个审计日志中的OLD_VALUE。



最后,我相信TEMP_DATA只包含您肯定要在EMP_TABLE上更改的值,因为您省略了任何WHERE子句。

(assuming the ID is an identity column) Truly awful, and the best argument I could give for using a Trigger instead.

Incidentally, if you are doing an audit don't you think it would be a good idea to also capture the date-time of the change, and possible who did it? If space is at a premium then why bother holding the new value on the audit table - this will be either the value currently on the EMP_TABLE or the OLD_VALUE stored on the next audit log for this EMP_ID.

Finally, I trust that TEMP_DATA only contains values that you definitely want to change on EMP_TABLE as you have omitted any WHERE clause.


如果您使用的是上面的2008 Server,我建议在桌面上启用CDC(更改数据捕获).Below是链接..



[ ^ ]



我有另一个答案,但它只是出于创意目的......

If your using above 2008 Server , i suggest to enable CDC(change Data capture) on table.Below is the link..

[^]

I have another answer but its just for idea purpose...
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


这篇关于在更新表数据的情况下,将旧数据与新数据一起作为data_log插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆