場景:imp導入數據時,最終觸發器報錯退出,並未導入存儲過程、觸發器、函數。
現在exp單獨導出元數據,然后imp導入元數據,驗證是否會影響已導入的表數據。
測試環境:CentOS 6.7 + Oracle 11.2.0.4
構造實驗環境:
1.導出scott用戶的表和數據
導出scott用戶的表和數據,此時並沒有觸發器、過程、函數這些對象:
exp scott/tiger OWNER=scott BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_exp.dmp LOG=scott_exp.log
2.scott用戶創建過程、函數、觸發器
scott用戶創建過程:
create or replace procedure pro_insert_dept is
begin
insert into dept values (99, 'xx_dept_name', 'Beijing');
end;
/
scott用戶創建函數:
create or replace function sp_fun1(spName varchar2) return number is
yearSal number(7, 2);
begin
select sal * 12 + nvl(comm, 0) * 12 into yearSal from emp where ename = spName; return yearSal;
end;
/
scott用戶觸發器:
--創建序列
CREATE SEQUENCE seq_del_id;
--創建表
CREATE TABLE emp_del_info(
autoid number primary key,
deptno number,
empno number,
ename varchar2(20),
del_rq date);
--創建觸發器
CREATE OR REPLACE TRIGGER trg_del_emp_info
BEFORE DELETE
ON emp
FOR EACH ROW
DECLARE
-- local variables here
BEGIN
INSERT INTO emp_del_info(autoid,deptno,empno,ename,del_rq)
VALUES(seq_del_id.NEXTVAL,:OLD.deptno,:OLD.empno,:OLD.ename,sysdate);
END;
/
3.導出scott元數據
導出scott元數據:
exp scott/tiger OWNER=scott ROWS=n BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=scott_metadata_exp.log
此時導出的元數據,是有觸發器、過程、函數這些對象的。
4.刪除scott用戶
確認沒有scott用戶登錄的session:
select 'alter system kill session '''||sid||','||serial#||''''||';' from v$session where username='SCOTT';
如果上述查詢有結果,那么直接把查出的結果復制執行即可kill掉scott用戶登錄的session。
刪除scott用戶:
SQL> drop user scott cascade;
User dropped.
5.導入scott表和數據
先創建用戶並賦權:
SQL> create user scott identified by tiger default tablespace users;
User created.
SQL> grant connect, resource to scott;
Grant succeeded.
導入表和數據:
imp scott/tiger BUFFER=10240000 RESUMABLE=y FILE=scott_exp.dmp LOG=imp_scott_exp.log IGNORE=y FULL=y
此時導入的只是表和表數據,沒有觸發器、過程、函數這些對象。
6.導入Scott元數據
imp scott/tiger BUFFER=10240000 RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=imp_scott_metadata_exp.log IGNORE=y FULL=y
此時導入的只是表結構、觸發器、過程、函數等這些對象,
最后驗證下是否覆蓋上一步已導入的表數據?
最終結論是沒有覆蓋已導入的表數據,之前未導入的過程、函數、觸發器也都成功導入。