我在SQL 2008的表中创建了一个更新语句,该表用一些错误的数据更新了表。
我没有备份数据库。
这是一些重要的日期。
无论如何,我可以从表中恢复旧数据。
由于
SNA
答案 0 :(得分:6)
基本上没有,除非您想使用商业日志阅读器并尝试使用细齿梳。没有数据库的备份可以是'更新简历,离开城镇'的情况 - 严厉但不应该发生。
答案 1 :(得分:6)
修改强>
一些评论者提到在运行它们之前测试更新/删除语句是个好主意。为了成为习惯,如果你有一个简单的方法,它会有所帮助。我通常会创建这样的DELETE
语句:
--delete --select *
from [User]
where UserID=27
要运行选择以测试查询,请突出显示从select
开始的所有内容。若要对筛选条件满意,请运行删除,突出显示从delete
开始的所有内容。 delete
前面的两个破折号是这样的,如果查询意外运行,它将因语法无效而崩溃。
您可以为UPDATE
语句使用类似的构造,尽管它不是那么干净。
答案 2 :(得分:3)
SQL Server会为每次转换保留日志。因此,您可以从日志中恢复已修改的数据,而无需备份。
Select [PAGE ID],[Slot ID],[AllocUnitId],[Transaction ID]
,[RowLog Contents 0], [RowLog Contents 1],[RowLog Contents 3],[RowLog Contents 4]
,[Log Record]
FROM sys.fn_dblog(NULL, NULL)
WHERE
AllocUnitId IN
(Select [Allocation_unit_id] from sys.allocation_units allocunits
INNER JOIN sys.partitions partitions ON (allocunits.type IN (1, 3)
AND partitions.hobt_id = allocunits.container_id) OR (allocunits.type = 2
AND partitions.partition_id = allocunits.container_id)
Where object_id=object_ID('' + 'dbo.student' + ''))
AND Operation in ('LOP_MODIFY_ROW','LOP_MODIFY_COLUMNS')
And [Context] IN ('LCX_HEAP','LCX_CLUSTERED')
这是艺术,它逐步解释,如何做到这一点。 http://raresql.com/2012/02/01/how-to-recover-modified-records-from-sql-server-part-1/
姆兰
答案 3 :(得分:1)
感谢所有回复。
问题实际上是偶然的 - 我错过了在更新声明中选择where条件.--- Rest!。
这是一个快速的5分钟任务 - 就像更改日期以测试一个客户数据一样 - 所以我们没有考虑进行备份。
是的,你当然是真的..这是一个教训。
现在我会小心地在交易中写下“我的更新语句”。或“测试我的更新语句”
再次感谢 - 花时间提供一些见解而忽略了问题,因为唯一的答案是“不”。
由于
SNA
答案 4 :(得分:0)
总是在主要UPDATE语句之前进行备份,即使它没有被使用,也能让您高枕无忧
特别是使用Red Gate的对象级还原,现在可以在给定备份文件的情况下恢复单个表/行
祝你好运,我建议在其他地方寻找旧版本(DEV / QA)等......答案 5 :(得分:0)
是否可以在UPDATE语句上进行回滚?
答案 6 :(得分:0)
迟到但希望有用...
如果数据库处于完全恢复模式,则所有事务都记录在事务日志中并可以检索。问题是这不是本机支持的,因为这不是事务日志的主要目的。
选项包括:
尝试自己做,就像user1059637指出的那样。这种方法的问题在于它无法读取事务日志备份并且更加繁琐。
归结为您的数据在时间和金额方面对您的价值。