Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2880663
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: 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]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读(6629) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~