14.2 表的导入与导出

普通用户可以导出自己的表,如果希望导出其他用户的表,必须在数据库中具有系统权限EXP_FULL_DATABASE,这个权限默认已经指定给所有的dba用户。例如,下面的语句导出scott用户的dept表和emp表:


$exp scott/tiger FILE=/home/oracle/scott1.exp TABLES=(dept, emp)

About to export specified tables via Conventional Path……

..exporting table DEPT 4 rows exported

..exporting table EMP 14 rows exported

Export terminated successfully without warnings.


下面的语句导出scott用户的dept表,但不导出表中的数据和索引:


$exp scott/tiger FILE=/home/oracle/scott2.exp TABLES=dept ROWS=N INDEXES=N


下面的语句导出分区表emp上的两个分区m和n:


$exp scott/tiger FILE=/home/oracle/scott3.exp TABLES=(emp:m, emp:n)


如果user1用户获得了EXP_FULL_DATABASE系统权限,就可以导出其他用户的表。例如,下面的语句以user1用户导出scott用户的dept表:


$exp user1/1234 FILE=/home/oracle/scott4.exp TABLES=scott.dept


导入数据意味着先通过CREATE语句创建表以及表上的索引、约束等对象,然后通过INSERT语句将数据写入表中。普通用户可以从自己导出的文件中导入自己的表。例如:


$imp scott/tiger FILE=/home/oracle/scott1.exp TABLES=(dept, emp)


如果要导入的表已经存在,导入操作将失败。所以在导入前,要确保在执行导入操作的用户的模式中,不存在这样的表。如果要向一个已经存在的表中导入数据,需要在imp命令中指定IGNORE参数的值为Y。还需要注意的是,表上的约束和触发器都可能导致导入失败,所以在导入前可以先删除表上的约束或触发器,或者将它们置为DISABLE状态。

即使一个表不属于某个用户,这个用户可以将这个表从导出文件中导入到自己的模式。通过这种方法,可以在不同用户之间传递数据。例如,通过下面的语句,user1从导出文件中将scott用户的dept表导入:


$imp user1/1234 FILE=/home/oracle/scott1.exp TABLES=(dept)


前面提到,一个用户为了能够导出其他用户的表,需要具有EXP_FULL_DATABASE系统权限。为了从这样的导出文件中导入一个表,imp命令中的用户也必须具有特殊的系统权限IMP_FULL_DATABASE,否则,即使是表的所有者,也不能从这个文件中导入表。例如,假设user1用户获得了系统权限IMP_FULL_DATABASE,下面的语句用于将scott用户的dept表从scott4.exp文件中导入到自己的模式中:


$imp user1/1234 FILE=/home/oracle/scott4.exp FROMUSER=scott TABLES=dept


假设希望在两个用户之间传输数据,但是执行导出和导入操作的是另外两个不相同的用户,这样在导入数据时经常会出现错误。在对数据库进行升级,或者在不同数据库之间移植数据时,这是经常困扰工程师的一个问题。在这里对这种复杂的关系进行一个简单的总结:

·一个用户在导出其他用户的表时,需要具有EXP_FULL_DATABASE系统权限。

·如果一个用户希望从这样的导出文件中导入一个表,需要具有IMP_FULL_DATABASE系统权限,而且需要通过参数FROMUSER指定表的所有者。

·如果一个用户希望从这样的导出文件将一个表导入到另外一个用户的模式中,需要具有IMP_FULL_DATABASE系统权限,而且需要通过参数FROMUSER指定表的所有者,通过参数TOUSER指定目标用户的名称。如果不指定TOUSER参数,则导入到当前用户自己的模式中。

例如,我们先以sys用户导出scott用户的dept表,该操作所对应的命令是:


$exp\'sys/1234 AS SYSDBA\'FILE=/home/oracle/scott5.exp TABLES=scott.dept


为了从文件scott5.exp中将表dept导入数据库,imp命令中的用户必须具有特殊的系统权限IMP_FULL_DATABASE。假设user1用户获得了IMP_FULL_DATABASE系统权限,下面的命令将scott用户的dept表导入到user2的模式中:


$imp user1/1234 FILE=/home/oracle/scott5.exp FROMUSER=scott

TABLES=dept TOUSER=user2


下面的命令将scott用户的dept表导入到scott的模式中:


$imp user1/1234 FILE=/home/oracle/scott5.exp FROMUSER=scott

TABLES=dept TOUSER=scott