WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2011-05-12 21:06:06
今天无意中想到一个问题,如果表上存在触发器,那么IMP和IMPDP导入的时候,是否会对导入结果造成影响。
下面进行简单的测试:
首先看一下触发器对IMP导入结果的影响。
SQL> SHOW USER
USER 为 "ADMIN"
SQL> CREATE TABLE TEST(ID INT,NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO TEST VALUES(1,'YANSHOUPENG');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
SQL> host exp admin/admin file=test.dmp tables=test
Export: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:11:27 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表 TEST导出了 1 行
成功终止导出, 没有出现警告。
首先创建一张表,并且插入一条记录,将记录导出。
下面创建一个触发器,每次插入的时候将NAME字段自动加上'[huateng] '。
SQL> CREATE OR REPLACE TRIGGER EXP_TRIGGER
2 BEFORE INSERT ON TEST
3 FOR EACH ROW
4 BEGIN
5 :NEW.NAME:=:NEW.NAME||'[huateng] ';
6 END;
7 /
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
SQL> INSERT INTO TEST VALUES(2,'YANSP');
已创建 1 行。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
2 YANSP[huateng]
可以看到触发器已经很好的发挥作用了。
下面看一下触发器对IMP的影响。
SQL> DELETE TEST;
已删除2行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM TEST;
未选定行
SQL> host imp admin/admin file=test.dmp tables=test ignore=y
Import: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:18:30 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 ADMIN 的对象导入到 ADMIN
. 正在将 ADMIN 的对象导入到 ADMIN
. . 正在导入表 "TEST"导入了 1 行
成功终止导入, 没有出现警告。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG[huateng]
我们原先导出的文件中的记录是 :
ID NAME
---------- ------------------------------
1 YANSHOUPENG
由于触发器的原因,导致我们导入的结果与原先不一致。
对于IMP导入和普通的INSERT操作没什么太大的区别,因此出现这样的结果也是正常的。
我们从V$SQLAREA视图中,找到如下的SQL语句:
INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "TEST" ("ID", "NAME") VALUES (:1, :2)。
以上导出的DMP文件是通过常规路径导出的,下面看看通过直接路径导出TEST表,利用直接路径导出的文件进行导入是否会对结果有影响。
不过凭猜测也能想到,即使采用直接路径导出应该和非直接路径导出的结果一样。因为EXP可以分直接路径导出和常规路径,而IMP没有直接路径导入。
不过还是测试一下。
SQL> DELETE FROM TEST;
已删除 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM TEST;
未选定行
SQL> ALTER TRIGGER EXP_TRIGGER DISABLE;
触发器已更改
SQL> INSERT INTO TEST VALUES(1,'YANSHOUPENG');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
SQL> ALTER TRIGGER EXP_TRIGGER ENABLE;
触发器已更改
SQL> host exp admin/admin file=direct_admin.dmp tables=test direct=true
Export: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:26:00 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过直接路径...
. . 正在导出表 TEST导出了 1 行
成功终止导出, 没有出现警告。
SQL> delete from test;
已删除 1 行。
SQL> commit;
提交完成。
SQL> host imp admin/admin file=direct_admin.dmp tables=test ignore=y
Import: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:26:40 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由直接路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 ADMIN 的对象导入到 ADMIN
. 正在将 ADMIN 的对象导入到 ADMIN
. . 正在导入表 "TEST"导入了 1 行
成功终止导入, 没有出现警告。
SQL> select * from test;
ID NAME
---------- ------------------------------
1 YANSHOUPENG[huateng]
可以看到,结果还是一样。对于有触发器表的IMP操作应该在导入之前,将表的所有触发器DISABLE掉,在导入完成后,在启用。
如下:
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG[huateng]
SQL> TRUNCATE TABLE TEST;
表被截断。
SQL> SELECT * FROM TEST;
未选定行
SQL> ALTER TABLE TEST DISABLE ALL TRIGGERS;
表已更改。
SQL> host imp admin/admin file=TEST.dmp tables=test ignore=y
Import: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:40:31 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 ADMIN 的对象导入到 ADMIN
. 正在将 ADMIN 的对象导入到 ADMIN
. . 正在导入表 "TEST"导入了 1 行
成功终止导入, 没有出现警告。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
SQL> ALTER TABLE TEST ENABLE ALL TRIGGERS;
表已更改。
SQL> INSERT INTO TEST VALUES(2,'YANSP');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM TEST;
ID NAME
---------- ------------------------------
1 YANSHOUPENG
2 YANSP[huateng]