將Oracle中的數據更改後出錯的解決方法

  今天上班犯了一個嚴重的錯誤:把我們系統所使用的Oracle數據庫中的數據給改掉了!當發現自己改錯時,頓時冒了一身冷汗。不過轉念一想,我們不是定期作了數據庫備份的嘛,適當的恢複一下,應該不會出現太大的問題吧,因爲我只是錯誤的使用了一個update語句。
  問題是這樣的:
  我們給系統創建了兩個用戶:com和comtest。前者存放的是正式庫數據,後者存放的測試庫數據。它們都有一個taw_rm_user表,存放了使用該系統的用戶基本信息,我就是把其中的password字段全部改成了123456。
  DMP備份文件是9月28號創建的,經過十一七天長假後到今天,已經有十幾天了,我簡單的查了一下日志,發現已經創建了幾個新的用戶,並且有些舊的用戶的其他信息也已經更改了。直接把備份文件中的taw_rm_user表導入com用戶下是肯定不行的。經過一段時間的冷靜思考後,得到了一個解決方案。大致思路是:
  1. 將測試庫的taw_rm_user表用CREATE TABLE AS語句導到一個臨時的備份表中(測試庫中的用戶表也不能亂改);
  2. 再將taw_rm_user表刪除;
  3. 然後將DMP備份文件的taw_rm_user表用IMP命令導入到comtest下;
  4. 再自己編寫一個PL/SQL程序塊,通過使用遊標循環,將這個新導入的表中的password字段更新到com.taw_rm_user表的對應記錄中。注意,這裏只更新對應記錄,對新加入的用戶記錄不作任何修改;
  5. 再將之前備份的taw_rm_user表恢複到comtest下即可。
  其中使用的兩段關鍵語句如下:
  -- 備份測試庫中的taw_rm_user表
  create table comtest.taw_rm_user_bak
  as
  select * from comtest.taw_rm_user
  -- 恢複正式庫中的taw_rm_user.password字段
  declare
  rec_comtest comtest.taw_rm_user%rowtype;
  cursor cur_comtest is
  select * from comtest.taw_rm_user;
  begin
  open cur_comtest;
  loop
  fetch cur_comtest into rec_comtest;
  exit when cur_comtest%notfound;
  update com.taw_rm_user
  set com.taw_rm_user.password=rec_comtest.password
  where com.taw_rm_user.user_id=rec_comtest.user_id;
  end loop;
  close cur_comtest;
  commit;
  end;
  這樣就可以在不更改其他所有信息的情況下,將所有舊用戶的密碼恢複到從前。