2010-02-01 36 views
15

Có cách nào chúng tôi có thể hoàn tác truy vấn cập nhật SQL không?Cập nhật SQL hoàn tác

+0

Bạn không nói gì cơ sở dữ liệu bạn đang sử dụng.Nếu bạn đang sử dụng oracle, bạn có thể thử một truy vấn flashback để có được dữ liệu sai lầm của bạn trở lại. –

Trả lời

16

Bạn không thể trừ khi bạn chạy nó trong một số transaction.

Tùy thuộc vào giao dịch DBMS của bạn sẽ được xử lý khác nhau, vì vậy hãy đọc tài liệu. Ví dụ với mysql dưới đây là cách nó đi:

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

Với Postresql:

BEGIN; 
UPDATE accounts SET balance = balance - 100.00 
    WHERE name = 'Alice'; 
-- etc etc 
COMMIT; 

Với TSQL:

DECLARE @TranName VARCHAR(20) 
SELECT @TranName = 'MyTransaction' 
BEGIN TRANSACTION @TranName 
GO 
USE pubs 
GO 
UPDATE roysched 
SET royalty = royalty * 1.10 
WHERE title_id LIKE 'Pc%' 
GO 
COMMIT TRANSACTION MyTransaction 
GO 

Ngoài ra còn có một số hành động mà không thể được đưa vào một giao dịch , nhưng trong hầu hết các hệ thống quản lý cơ sở dữ liệu, bạn có thể tìm thấy những ngày này, bạn sẽ có thể khôi phục một số update.

Cuối cùng, bạn luôn có thể hoàn tác bản cập nhật nếu bạn lưu nhật ký chính xác mọi thứ xảy ra trong cơ sở dữ liệu, nhưng đó là một câu chuyện khác.

5

Nếu bạn chạy bản cập nhật bên trong một giao dịch, bạn có thể khôi phục giao dịch.

SQL Server:

begin transaction 

update [Table] set col1 = 'test' where Id = 3 

rollback transaction 

kỹ thuật khác có thể là để thêm một bản cập nhật kích hoạt để bàn, và bất cứ lúc nào các bản ghi được cập nhật, lưu giá trị trước đó tắt thành một "lịch sử" bảng. Điều này có thể hoặc có thể không phải là một ý tưởng tốt nếu bảng này được sử dụng nhiều.

2

Hoàn tác được gọi là rollback trong SQL. Khi bạn đã hoàn tất commit, bạn không thể hoàn tác tác vụ này mà không cần khôi phục bản sao lưu. Lưu ý rằng việc thực hiện khôi phục sẽ hoàn tác toàn bộ giao dịch, có nghĩa là mọi cập nhật, chèn và xóa kể từ khi giao dịch bắt đầu, thường là từ lần commit hoặc rollback cuối cùng. Điều này có nghĩa là nếu bạn thực hiện hai cập nhật liên tiếp, bạn không thể hoàn tác bản cập nhật thứ hai. Một số cơ sở dữ liệu cung cấp "điểm lưu trữ" cho phép điều này.

1

Chỉ khi bạn đang ở trong một giao dịch (như marcgg) cho biết hoặc nếu bạn có một bản sao lưu gần đây ... hồi phục cách mà không căng thuật ngữ "undo" rathermuch ..

0

Bạn có thể sử dụng một công cụ của bên thứ ba giống như Cổng Đỏ Log Rescue. Có 14 ngày dùng thử miễn phí, chức năng của Bộ công cụ SQL của họ. (Giả sử SQL Server 2000!).

6

Máy chủ SQL không hỗ trợ tính năng này ra khỏi hộp nhưng trong một số trường hợp, có thể khôi phục dữ liệu bằng cách đọc nhật ký giao dịch. Điều này hoạt động nếu cơ sở dữ liệu ở chế độ khôi phục đầy đủ và các công cụ của bên thứ 3 như ApexSQL Log hoặc Log Rescue là cần thiết. Ngoài ra còn có một cách để đọc t-log sử dụng lệnh DBCC LOG nhưng nó có lẽ sẽ trở nên quá khó khăn.

Bạn cũng có thể kiểm tra chủ đề sau nơi này sẽ được thảo luận:

How can I rollback an UPDATE query in SQL server 2005?

Read the log file (*.LDF) in SQL Server 2008

Các vấn đề liên quan