使用动态SQL克隆数据库对象
上一篇 /
下一篇 2012-03-31 09:43:21
/ 个人分类:数据库
如果你需要复制一个表并在(另一个用户名下的)另一个方案(schema)制作它的一个副本,那么你可以使用 SQL*Plus 的 COPY 命令,或者使用简单的语句“create table foo as select * from other.foo;”,只要你在另一个用户的表上有足够的 select 权限。
xE#|]!Fnm.N
l0 然而,如果你需要对任何其它数据库对象做同样的事情,比如包、过程、函数或视图,就没有这么简单的命令了。你需要手工找出其代码并在新实例中运行它。如果能够简单“克隆对象”并让另一个用户的对象出现在自己的实例中,那将是一件非常值得高兴的事。对于为开发过程创建测试方案来说,这一点非常有用。在这个例子中,我将创建一个包,使用该包可以对大多数对象进行克隆(具有一些限制)。51Testing软件测试网N!QirL-ZB9N
f-F'``y0 要处理的主要问题是获得源代码。对象所有者通过视图USER_SOURCE 可以访问源代码。而对于其它用户,如果对象被授予了EXECUTE 权限给一个用户,那么这个用户就只能看到通过视图ALL_SOURCE 选出的源代码。我们可以通过一个过程来封装“give me the source for your object(给我你的对象的源代码)”请求:51Testing软件测试网NW m jG/T6c_
t/ml'`%[+k5e0
[X/B/Yc#l$vV!q2n0create or replace procedure get_source51Testing软件测试网%E;kh#zM2j(EaoK ( mo&Dre2{0p_type varchar2,51Testing软件测试网1N'p0r,nc p_name varchar2,51Testing软件测试网\8Dt.s6E"T+G)_PL1T p_cursor out sys_refcursor ;gz%n3lc
w*r)Q0) T;Oc2Bah0as51Testing软件测试网 O0ip.E!U7yS begin %DN;{wc0zY0open p_cursor for51Testing软件测试网!Vz~9e7E select text from user_source51Testing软件测试网#xb;rnwo where type = upper(p_type) and name = p_name T9BK8i{(XfSQ0order by line;51Testing软件测试网&F.T;l(X8P^s;c end get_source; 9s?:~%ipR ix0/ U|}$HO2pG
a0show errors; |
51Testing软件测试网o4Qr-Z5tR"Xq