2009-04-06 30 views
17

Làm cách nào để khôi phục truy vấn UPDATE trong SQL Server 2005?Làm cách nào để khôi phục truy vấn UPDATE trong SQL Server 2005?

Tôi cần thực hiện việc này trong SQL, không phải thông qua mã.

+1

những gì bạn có ý nghĩa với bản cập nhật? bạn có thể nhận thêm một chút về câu hỏi này không? –

+1

tôi đã cập nhật một bảng mà là sai lầm khủng khiếp của tôi..instead của updting hàng duy nhất .. với sự bất cẩn của tôi đã cập nhật tất cả các hàng ... làm thế nào để tôi quay trở lại này .... xin vui lòng giúp ..... – Guddu

+1

bạn cần Nhật ký ApexSQL. –

Trả lời

5

Bạn có thể khôi phục các câu lệnh bạn đã thực hiện trong giao dịch. Thay vì cam kết giao dịch, hãy quay lại giao dịch.

Nếu bạn đã cập nhật một cái gì đó và muốn rollback những bản cập nhật, và bạn đã không làm được điều này bên trong một giao dịch (không-chưa-cam), sau đó tôi nghĩ rằng đó là mặc dù may mắn ...

(Manually sửa chữa hoặc, khôi phục bản sao lưu)

30
begin transaction 

// execute SQL code here 

rollback transaction 

Nếu bạn đã thực hiện các truy vấn và muốn cuộn nó lại, không may thực sự lựa chọn duy nhất của bạn là để khôi phục lại một bản sao lưu cơ sở dữ liệu. Nếu bạn đang sử dụng Sao lưu toàn bộ, thì bạn sẽ có thể khôi phục cơ sở dữ liệu đến một thời điểm cụ thể.

+1

bạn có ý nghĩa gì với Sao lưu toàn bộ, tôi có nên sao lưu cơ sở dữ liệu hàng ngày không, tôi có quen với điều này không? – stom

1

Sau khi cập nhật được cam kết, bạn không thể khôi phục chỉ bản cập nhật duy nhất. Đặt cược tốt nhất của bạn là quay trở lại bản sao lưu trước đó của cơ sở dữ liệu.

1

Từ thông tin bạn đã chỉ định, cơ hội phục hồi tốt nhất của bạn là thông qua sao lưu cơ sở dữ liệu. Tôi không nghĩ rằng bạn sẽ có thể khôi phục bất kỳ thay đổi nào mà bạn đã đẩy qua vì bạn dường như không sử dụng các giao dịch vào thời điểm đó.

28

Bạn cần công cụ này và bạn có thể tìm giao dịch và đảo ngược giao dịch đó.

ApexSQL Log

+1

"Ooops - chúc bạn có thể khôi phục lại câu lệnh Update mà không có mệnh đề where !? ApexSQL Log có khả năng ROLLBACK giao dịch cho cơ sở dữ liệu SQL Server." Great line! –

+2

số điện thoại đó có vẻ tuyệt vời nhưng chi phí là 2000 đô la –

0

Như đã nói không có gì bạn có thể làm ngoại trừ khôi phục lại từ một bản sao lưu được. Ít nhất bây giờ bạn sẽ học cách luôn luôn bọc các câu lệnh trong một giao dịch để xem điều gì xảy ra trước khi bạn quyết định cam kết. Ngoài ra, nếu bạn không có một bản sao lưu của cơ sở dữ liệu của bạn, điều này cũng sẽ dạy bạn sao lưu thường xuyên cơ sở dữ liệu của bạn.

Mặc dù chúng tôi không trợ giúp nhiều cho vấn đề bắt chước của bạn ... hy vọng những câu trả lời này sẽ đảm bảo bạn không gặp phải vấn đề này một lần nữa trong tương lai.

-3

Hãy thử

ROLLBACK WORK; 

Nó thường làm việc

1

đơn giản để làm:

mã tiêu đề ...

Set objMyConn = New ADODB.Connection 

Set objMyCmd = New ADODB.Command Set 

objMyRecordset = New ADODB.Recordset 

On Error GoTo ERRORHAND 

đang làm việc ...

objMyConn.ConnectionString = ConnStr 

objMyConn.Open 

mã ....

'Sao chép dữ liệu từ Excel'

objMyConn.BeginTrans <-- define transactions to possible be rolled back 

For NewRows = 2 To Rows 

objMyRecordset.AddNew 

For NewColumns = 0 To Columns - 1 

objMyRecordset.Fields(NewColumns).Value = ActiveSheet.Cells(NewRows, NewColumns + 1) 

Next NewColumns objMyRecordset.Update Next NewRows 

objMyConn.CommitTrans <- if success, commit them to DB 

objMyConn.Close 

ERRORHAND:

Success = False 

objMyConn.RollbackTrans <-- here we roll back if error encountered somewhere 

LogMessage = "ERROR writing database: " & Err.Description 

...

6

Bạn có thể sử dụng giao dịch ngầm cho điều này

SET IMPLICIT_TRANSACTIONS ON 

update Staff set staff_Name='jas' where staff_id=7 

ROLLBACK 

Như bạn request-- bạn có thể đặt thiết lập này (SET IMPLICIT_TRANSACTIONS ON) từ một thủ tục lưu trữ bằng cách thiết lập rằng thủ tục lưu trữ là một quá trình khởi động.

Nhưng lệnh SET IMPLICIT TRANSACTION ON là kết nối cụ thể. Vì vậy, bất kỳ kết nối nào khác với kết nối chạy thủ tục lưu sẵn sẽ không được hưởng lợi từ cài đặt bạn đã đặt.

0

trong ví dụ này, chúng tôi chạy 2 dòng chèn vào truy vấn và nếu tất cả trong số họ thực sự nó chạy nhưng nếu không có bất cứ điều gì chạy và ROLLBACK

DECLARE @rowcount int set @rowcount = 0 ; 
BEGIN TRANSACTION [Tran1] 
BEGIN TRY 
insert into [database].[dbo].[tbl1] (fld1) values('1') ; 
    set @rowcount = (@rowcount + @@ROWCOUNT); 
insert into [database].[dbo].[tbl2] (fld1) values('2') ; 
    set @rowcount = (@rowcount + @@ROWCOUNT); 

IF @rowcount = 2 
    COMMIT TRANSACTION[Tran1] 
ELSE 
    ROLLBACK TRANSACTION[Tran1] 
END TRY 
    BEGIN CATCH 
    ROLLBACK TRANSACTION[Tran1] 
END CATCH 
Các vấn đề liên quan