再问一次:如何动态创建(事实上是复制)一个ORACLE上的数据库用户?

alphazhao 2002-09-05 12:19:26
如何动态地建立一个与现存数据库用户相同,即同样包含所有表、数据、触发器及过程的新用户?
也就是说两者除了名字不同以外,其它都完全相同,比如我有个Test数据库用户,其下有很多表啊,视图啊等等,我需要动态的建立一个新的用户ALPHA和它一模一样。
因为是要动态创建,所以请问该如何写这个存储过程(or 函数)?实在无法办到,用脚本也行。
大虾们请指教啊,给个例子代码也行啊

问了几天居然没有人能够给个答案,大家帮帮忙救命啊
解决了
两贴同结!!共400分,还要再加!!!!!
...全文
147 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
blue__star 2002-09-09
  • 打赏
  • 举报
回复
可以用EXP到处,用IMP导入
然后再写动态SQL,替换它们的名字呀
bzszp 2002-09-09
  • 打赏
  • 举报
回复
对不起,去掉full=y
lindqp 2002-09-09
  • 打赏
  • 举报
回复
exp userid=test/test buffer=20000 indexes=n grants=n file=c:\1.dmp log=1.log

imp userid=zis/zis fromuser=test touser=zis commit=y buffer=20000 ignore=n indexes=n grants=n file=c:\1.dmp log=c:\1.log
alphazhao 2002-09-09
  • 打赏
  • 举报
回复
给个简单的例子先?
老实说我真的不怎么懂oracle阿
alphazhao 2002-09-06
  • 打赏
  • 举报
回复
但现在客户需求是在过了一段时期后,就要建立一个新的数据库(即通过复制一个基础数据库建立)来运行啊,在会计上而言就是新建帐套!
我想了想,整个流程应该如下:
1、创建表空间:
alter tablespace USERNAME offline;
drop tablespace USERNAME including contents;
create tablespace USERNAME
……参数
2、创建系统用户
create user USERNAME identified by PASSWORD
default tablespace USERNAMES
temporary tablespace TEMP
profile DBA_PROFILE;
3、分配表空间
怎么分配?sql代码?
4、导出、导入所有schema下的结构:包括表、视图、触发器……等等以及数据
exp/imp的sql语句?(是否有设置这种导出导入全部结构的参数?)

我就是不知道第3、4步怎么写
alphazhao 2002-09-06
  • 打赏
  • 举报
回复
楼上的好像是导出导入整个数据库阿?
bzszp 2002-09-06
  • 打赏
  • 举报
回复
EXP SYSTEM/MANAGER OWNER=yourname file=c:\a.dmp full=y

IMP yourname/pword file=c:\a.dmp FULL=Y IGNORE=Y
BUFFER=1024000
alphazhao 2002-09-06
  • 打赏
  • 举报
回复
能否给个类似
exp scott/tiger full=Y rows=N file=full.dmp
imp scott/tiger full=Y rows=N file=full.dmp
这种代码?
我不能确定那些参数是必须的,哪些又可以不要而且能够导出导入这个用户下的所有的东西。
bzszp 2002-09-06
  • 打赏
  • 举报
回复
分配表空间?
你在创建用户的时候已经分配表空间了啊

EXP参数:
关键字 说明(默认)
---------------------------------------------------
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小
OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 表名列表
COMPRESS 导入一个范围 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句

imp参数:
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
TOID_NOVALIDATE 跳过指定类型 id 的校验
FILESIZE 各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)
rltan 2002-09-06
  • 打赏
  • 举报
回复
可以建一个角色(Role),把第一个用户的权限赋予role,然后直接把role赋予第二个用户
bzszp 2002-09-05
  • 打赏
  • 举报
回复
在一个库里你要使用相同的表名,过程名这样不行吧
你可以在这些表中加一个字段存放用户信息,来说明此数据属于哪个用户.
这样的话就比较容易实现
只需要创建一个用户,把需要的操作权限给他就可以了.
Michaelyfj 2002-09-05
  • 打赏
  • 举报
回复
用快照应该可以
KingSunSha 2002-09-05
  • 打赏
  • 举报
回复
准确地说,你要创建的不是一个database,而是一个schema

你当前已经有了一个样本schema,要复制一个新的schema,最容易的办法是用exp/imp,如果你一定要用程序来完成,那就把样本中所有对象的创建的DDL导出为一个脚本,然后在程序中执行这个脚本.

这种做法并不推荐,你要考虑很多东西(比如多个用户同时创建如何处理),而且创建用户需要相当高的权限,给普通用户授这么高的权限是很危险的. 这种工作应该考虑由DBA来做.
jiezhi 2002-09-05
  • 打赏
  • 举报
回复
难题
jlandzpa 2002-09-05
  • 打赏
  • 举报
回复
你的要求实际上就是实现exp/imp的功能,有些麻烦.
alphazhao 2002-09-05
  • 打赏
  • 举报
回复
问题是不只是需要创建一个用户而已,其实等同于创建一个数据库!!!问题如果那么简单也就不用到处问了。
难道楼上认为我所说的oracle的数据库用户是指一个user+password而已么?它应该是一个database来的。
相关贴子见:
http://www.csdn.net/expert/topic/989/989428.xml?temp=.9322473
因为太长,所以开新贴!!!!

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧