• CREATE TABLE actualData (ID INT NOT NULL, Col1 VARCHAR(10), Col2 VARCHAR(10))

    CREATE TABLE historicalData (ID INT NOT NULL, Date DATETIME DEFAULT GETDATE(), Col1 VARCHAR(10), Col2 VARCHAR(10))

    CREATE TRIGGER trg_actualData ON actualData FOR UPDATE

    AS

    INSERT INTO historicalData (ID, Col1, Col2) SELECT Id, Col1, Col2 FROM deleted

    INSERT INTO actualData VALUES (1, 'test', '1rst')

    UPDATE actualData SET Col2 = '2nd' WHERE ID = 1

    UPDATE actualData SET Col2 = '3rd' WHERE ID = 1

    SELECT * FROM actualData

    SELECT * FROM historicalData

    In this example you will insert every change on actualData in historicalData.

    If you only want to store the last data from actualData then you have to change the trigger.

    CREATE TABLE actualData1 (ID INT NOT NULL, Col1 VARCHAR(10), Col2 VARCHAR(10))

    CREATE TABLE historicalData1 (ID INT NOT NULL, Date DATETIME DEFAULT GETDATE(), Col1 VARCHAR(10), Col2 VARCHAR(10))

    CREATE TRIGGER trg_actualData1 ON actualData1 FOR UPDATE

    AS

    MERGE historicalData1 AS trg

    USING (SELECT ID, Col1, Col2 FROM deleted) AS src (ID, Col1, Col2) ON src.ID = trg.ID

    WHEN MATCHED THEN

    UPDATE SET trg.Col1 = src.Col1, trg.Col2 = src.Col2

    WHEN NOT MATCHED BY TARGET THEN

    INSERT (Id, Col1, Col2) VALUES (ID, Col1, Col2);

    INSERT INTO actualData1 VALUES (1, 'test', '1rst')

    UPDATE actualData1 SET Col2 = '2nd' WHERE ID = 1

    UPDATE actualData1 SET Col2 = '3rd' WHERE ID = 1

    SELECT * FROM actualData1

    SELECT * FROM historicalData1



    If you need to work better, try working less...