在使用Oracle的過程中我們給系統創建了兩個用戶:com和comtest。前者存放的是正式庫數據,後者存放的測試庫數據。它們都有一個taw_rm_user表,存放了使用該系統的用戶基本信息,於是就是把其中的password字段全部改成了123456。
DMP備份文件創建後,經過一段時間創建了幾個新的用戶,並且有些舊的用戶的其他信息也已經更改了。但是需要把舊用戶的密碼恢復到從前,直接把備份文件中的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下即可。
其中使用的關鍵SQL語句如下:
-- 備份測試庫中的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;
這樣就可以實現在不更改其他所有信息的情況下,將所有舊用戶的密碼恢復到從前。