触发器对IMP/IMPDP导入结果的影响(一)

文章来自:http://blog.chinaunix.net/uid-22948773-id-2600970.html


首先看一下触发器对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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值