问题是这样的:我的数据库中的表设置了自增列,当我想通过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;
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;
到目标库重新创建。个人观点,因为触发器是依附于表的,所以,能连带导出,而序列等内容是相对独立,所以,不能随带表导出。
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:\>
create sequence bais_login_seq increment by 1 start with 21 nomaxvalue nocycle;如果就这一张表要建序列的话,我也就多操作一步得了;但是假如我有很多表都有记录了,而且都要重建的话,我还得先看看每张表有多少条记录了,那不是很麻烦?oracle能不能导出已有的序列的脚本,这样我好一次性执行下?或者还有什么好的办法啊?
如果楼主是针对某个用户的整体迁移,则不用考虑语法重建等问题。如果是针对表的迁移,可通过plsql,toad等第三方工具或使用DBMS_METADATA包来得到指定对象的语法