问题是这样的:我的数据库中的表设置了自增列,当我想通过CMD的exp命令备份数据时,只把表导出来了,而和这些表相关联的序列和触发器却没有导出来。请高人指点,或者有什么其他好方法,烦请不吝赐教。--创建表
create table bais.login
(
 vc_id integer primary key,
 vc_name varchar(20) not null,
 vc_password varchar(20) not null
);
--创建序列
create sequence bais_login_seq increment by 1 start with 1 nomaxvalue nocycle;
--创建触发器
create trigger bais_login_tri before insert on bais.login for each row begin select bais_login_seq.nextval into:new.vc_id from dual;end;

解决方案 »

  1.   

    triggers=y 能导出表上的触发器,但相关的序列不能随之导出。
    到目标库重新创建。个人观点,因为触发器是依附于表的,所以,能连带导出,而序列等内容是相对独立,所以,不能随带表导出。
      

  2.   


    trigger和sequence默认都是会自动导出的,也会自动导入!d:\>sqlplus /nologSQL*Plus: Release 10.2.0.4.0 - Production on 星期日 4月 5 21:36:08 2009Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.idle> conn / as sysdba
    已连接。
    sys@TEST> create user bais identified by bais;用户已创建。sys@TEST> grant create session,create table,create sequence,create trigger to bais;授权成功。sys@TEST> alter user bais quota unlimited  on users;用户已更改。sys@TEST> conn bais/bais
    已连接。
    bais@TEST> create table  login
      2  (
      3  vc_id integer primary key,
      4  vc_name varchar(20) not null,
      5  vc_password varchar(20) not null
      6  );表已创建。bais@TEST> --创建序列
    bais@TEST> create sequence bais_login_seq increment by 1 start with 1 nomaxvalue nocycle;序列已创建。bais@TEST> --创建触发器
    bais@TEST> CREATE TRIGGER BAIS_LOGIN_TRI
      2    BEFORE INSERT ON  LOGIN
      3    FOR EACH ROW
      4  BEGIN
      5    SELECT BAIS_LOGIN_SEQ.NEXTVAL INTO :NEW.VC_ID FROM DUAL;
      6  END;
      7  /触发器已创建bais@TEST> insert into login(vc_name,vc_password) values('a','b');已创建 1 行。bais@TEST> select * from login;     VC_ID VC_NAME              VC_PASSWORD
    ---------- -------------------- --------------------
             1 a                    bbais@TEST> insert into login(vc_name,vc_password) values('a2','b2');已创建 1 行。bais@TEST> commit;提交完成。bais@TEST> select * from login;     VC_ID VC_NAME              VC_PASSWORD
    ---------- -------------------- --------------------
             1 a                    b
             2 a2                   b2bais@TEST> host
    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.d:\>exp bais/bais file=xxx.dmp owner=baisExport: Release 10.2.0.4.0 - Production on 星期日 4月 5 21:41:49 2009Copyright (c) 1982, 2007, Oracle.  All rights reserved.
    连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
    . 正在导出 pre-schema 过程对象和操作
    . 正在导出用户 BAIS 的外部函数库名
    . 导出 PUBLIC 类型同义词
    . 正在导出专用类型同义词
    . 正在导出用户 BAIS 的对象类型定义
    即将导出 BAIS 的对象...
    . 正在导出数据库链接
    . 正在导出序号
    . 正在导出簇定义
    . 即将导出 BAIS 的表通过常规路径...
    . . 正在导出表                           LOGIN导出了           2 行
    . 正在导出同义词
    . 正在导出视图
    . 正在导出存储过程
    . 正在导出运算符
    . 正在导出引用完整性约束条件
    . 正在导出触发器
    . 正在导出索引类型
    . 正在导出位图, 功能性索引和可扩展索引
    . 正在导出后期表活动
    . 正在导出实体化视图
    . 正在导出快照日志
    . 正在导出作业队列
    . 正在导出刷新组和子组
    . 正在导出维
    . 正在导出 post-schema 过程对象和操作
    . 正在导出统计信息
    成功终止导出, 没有出现警告。d:\>exitbais@TEST> conn / as sysdba
    已连接。
    sys@TEST> drop user bais cascade;用户已删除。sys@TEST> create user bais identified by bais1;用户已创建。sys@TEST> grant create session,create table,create sequence,create trigger to bais;授权成功。sys@TEST> alter user bais quota unlimited  on users;用户已更改。sys@TEST> conn bais/bais1
    已连接。
    bais@TEST> select * from login;
    select * from login
                  *
    第 1 行出现错误:
    ORA-00942: 表或视图不存在
    bais@TEST> host
    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.d:\>imp bais/bais1 file=xxx.dmpImport: Release 10.2.0.4.0 - Production on 星期日 4月 5 21:44:25 2009Copyright (c) 1982, 2007, Oracle.  All rights reserved.
    连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options经由常规路径由 EXPORT:V10.02.01 创建的导出文件
    已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
    . 正在将 BAIS 的对象导入到 BAIS
    . . 正在导入表                         "LOGIN"导入了           2 行
    成功终止导入, 没有出现警告。d:\>exit
    bais@TEST> select *from login;     VC_ID VC_NAME              VC_PASSWORD
    ---------- -------------------- --------------------
             1 a                    b
             2 a2                   b2bais@TEST> insert into login(vc_name,vc_password) values('a3','b3');已创建 1 行。bais@TEST> select *from login;     VC_ID VC_NAME              VC_PASSWORD
    ---------- -------------------- --------------------
             1 a                    b
             2 a2                   b2
            21 a3                   b3bais@TEST> commit;提交完成。bais@TEST> conn / as sysdba
    已连接。
    sys@TEST> drop user bais cascade;用户已删除。sys@TEST> exit
    从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开d:\>del xxx.dmpd:\>
      

  3.   

    你好 jdsnhan ,我想问下:我导入表中的数据已经有了20条记录了。那我再到目标库重新创建序列,不是要从21开始自增了吗,脚本如下。
    create sequence bais_login_seq increment by 1 start with 21 nomaxvalue nocycle;如果就这一张表要建序列的话,我也就多操作一步得了;但是假如我有很多表都有记录了,而且都要重建的话,我还得先看看每张表有多少条记录了,那不是很麻烦?oracle能不能导出已有的序列的脚本,这样我好一次性执行下?或者还有什么好的办法啊?
      

  4.   

    你好 oracledbalgtu:我想问下,你贴出来的操作步骤中,在准备导入之前你只删除了用户(drop user bais cascade;),并没有把序列和触发器给删除,所以在你把数据库备份文件再导进来的时候,自然是可以插入的。
      

  5.   


    如果楼主是针对某个用户的整体迁移,则不用考虑语法重建等问题。如果是针对表的迁移,可通过plsql,toad等第三方工具或使用DBMS_METADATA包来得到指定对象的语法
      

  6.   

    还想追问个问题,2楼给出的答案是按照用户导出导入,如果是按照表导出再导入的话,序列还会在吗?如果不在的话,导入之后就重建序列并且起步值为导出时序列的next?