2015-11-05 67 views
2

從#myTempTwoSQL服務器 - 更新錶的歷史

sno  | name  |budget |NameTrim |TravelCost| Expense 
1  |Local Travel |123 |Travel  |246  | NULL 
2  |Global Travel |123 |Travel  |246  | NULL 
3  |Local Expense |12  |Expense |NULL  | 24 
4  |Curent Expense |12  |Expense |NULL  | 24 

方案考慮下面的數據樣本,其中TravelCostExpense是用null值更新。假設1爲費用,2爲旅行費用。

現在說更新:

update #myTempTwo 
set TravelCost = '2' where TravelCost is null 
update #myTempTwo 
set Expense = '1' where Expense is null 

這將產生:

sno  | name  |budget |NameTrim |TravelCost| Expense 
    1  |Local Travel |123 |Travel  |246  | 1 
    2  |Global Travel |123 |Travel  |246  | 1 
    3  |Local Expense |12  |Expense |2   | 24 
    4  |Curent Expense |12  |Expense |2   | 24 

我可以以某種方式看到原來的數據(從運行更新,而無需將其保存在其他一些表之前我。 '尋找一些'撤消'或'查看歷史'或一些'臨時快照'?(使用sql server 2012)

如果是,我該怎麼辦?

+0

做一個數據庫備份 –

+0

和其他? @GiorgiNakeuri – CM2K

+0

爲什麼你排除「保存在其他表」作爲選項? 'SELECT * INTO #myTempTwo_backup FROM#myTempTwo'確實是最簡單的解決方案。 – Heinzi

回答

1

這裏是觸發和歷史表的例子:

CREATE TABLE OriginaTable(ID INT IDENTITY, Price MONEY) 
GO 

CREATE TABLE HistoryTable(ID INT IDENTITY, OriginalID INT, Price MONEY, CreatedDate DATETIME) 
GO 

CREATE TRIGGER trOriginaTable ON OriginaTable 
FOR UPDATE 
AS 
BEGIN 
    IF UPDATE(Price) 
    BEGIN 
     INSERT INTO dbo.HistoryTable 
       (OriginalID, Price, CreatedDate) 
       SELECT ID, Price, GETDATE() FROM Deleted 
    END 
END 
GO 

INSERT INTO OriginaTable VALUES(NULL) 
GO 

UPDATE dbo.OriginaTable SET Price = 100 WHERE ID = 1 
UPDATE dbo.OriginaTable SET Price = 10 WHERE ID = 1 
UPDATE dbo.OriginaTable SET Price = 200 WHERE ID = 1 

SELECT * FROM dbo.HistoryTable 

輸出:

ID OriginalID Price CreatedDate 
1 1   NULL 2015-11-05 18:46:49.823 
2 1   100.00 2015-11-05 18:46:49.830 
3 1   10.00 2015-11-05 18:46:49.833 

正如你看到的歷史保存所有舊值。

+0

太棒了,謝謝你的例子 – CM2K