Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-更新表历史记录_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server SQL Server-更新表历史记录

Sql server SQL Server-更新表历史记录,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,考虑来自MyWestwo的以下数据示例 sno | name |budget |NameTrim |TravelCost| Expense 1 |Local Travel |123 |Travel |246 | NULL 2 |Global Travel |123 |Travel |246 | NULL 3 |Local Expense |12

考虑来自MyWestwo的以下数据示例

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
TravelCost或Expense为空的场景使用值更新。让我们假设费用为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


如果是,我怎么做?

下面是一个触发器和历史记录表的示例:

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

如您所见,历史记录保存所有旧值。

是否进行数据库备份以及其他@Giorginakeuriwiwhy排除将其保存在其他表中作为选项?选择*INTO myfentwo\u从myfentwo备份确实是最简单的解决方案。好吧,想象一下,你执行了一次不想执行的更新,插入了一些错误的值。您没有使用临时备份,备份是每日/每周的,您不能使用临时备份,因为在此期间执行了一些其他查询,您无法返回。有什么事要做吗?ps:实际上我没有问题,我这样做是为了了解SQLCheck out CDC Change Data Capture的奇妙之处,这可能对临时表不起作用,但由于您只是在调查,所以值得一看。