问题描述
嗨,汤姆,
我是oracle的新手,需要有关其中一种情况的一些建议。
我需要将几个软件包从一个连接复制到另一个连接。
包是相互依赖和依赖于其他对象的。
示例:
PackageA内部从packageB调用一个过程。
PackageB从ViewA获取数据。
PackageA指的是同一数据库中的SequenceA。
PackageA更新TableA,TableA有一个调用PackageC的触发器。
有什么方法可以完全复制所有依赖对象。
我尝试单独复制它们,但失败了,场景比示例中要大得多。
感谢您的任何帮助。
谢谢。
我是oracle的新手,需要有关其中一种情况的一些建议。
我需要将几个软件包从一个连接复制到另一个连接。
包是相互依赖和依赖于其他对象的。
示例:
PackageA内部从packageB调用一个过程。
PackageB从ViewA获取数据。
PackageA指的是同一数据库中的SequenceA。
PackageA更新TableA,TableA有一个调用PackageC的触发器。
有什么方法可以完全复制所有依赖对象。
我尝试单独复制它们,但失败了,场景比示例中要大得多。
感谢您的任何帮助。
谢谢。
专家解答
您可以使用data pump导出/导入对象:
https://oracle-base.com/articles/10g/oracle-data-pump-10g
或SQL开发人员购物车来选择要复制的对象:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/12c_sqldev/cart_sql_dev/12cCart.html
但我猜问题是你正在努力寻找所有的依赖关系。您可以使用 * _dependencies视图来找到这个。
我已经建模了类似于您的简化示例的内容 (请参阅底部的代码)。你可以找到PKGA需要的所有对象,比如:
这找到你编译PKGA所需的所有对象。但不是你要找的一切!PKGA不依赖于触发器。所以它不在列表中。
要得到这个,你可以去 “自下而上”,从所有的表开始:
现在你有了扳机。但是你仍然缺少它需要的PKGC!所以你必须再次从触发器中 “自上而下”...
如果您的表中有虚拟列,则这些依赖的任何PL/SQL也不会显示。
因此,除非有一个特定的原因,你只需要复制一些对象,你可能会更好地迁移所有的东西。另外请注意,您需要的对象可能在另一个用户中!
示例代码:
https://oracle-base.com/articles/10g/oracle-data-pump-10g
或SQL开发人员购物车来选择要复制的对象:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/12c_sqldev/cart_sql_dev/12cCart.html
但我猜问题是你正在努力寻找所有的依赖关系。您可以使用 * _dependencies视图来找到这个。
我已经建模了类似于您的简化示例的内容 (请参阅底部的代码)。你可以找到PKGA需要的所有对象,比如:
select distinct referenced_owner, referenced_name, referenced_type
from all_dependencies u
start with name = 'PKGA'
and owner = user
connect by nocycle prior referenced_name = name
and prior referenced_owner = owner
and referenced_owner <> 'SYS';
REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE
------------------------------ ------------------------------ ------------------
CHRIS TB TABLE
CHRIS V VIEW
CHRIS S SEQUENCE
CHRIS TC TABLE
CHRIS TA TABLE
CHRIS PKGA PACKAGE
CHRIS PKGB PACKAGE
这找到你编译PKGA所需的所有对象。但不是你要找的一切!PKGA不依赖于触发器。所以它不在列表中。
要得到这个,你可以去 “自下而上”,从所有的表开始:
select distinct owner, name, type from all_dependencies start with referenced_type = 'TABLE' and referenced_owner = user connect by nocycle referenced_name = prior name and referenced_owner = prior owner; OWNER NAME TYPE ------------------------------ ------------------------------ ------------------ CHRIS V VIEW CHRIS PKGB PACKAGE BODY CHRIS PKGA PACKAGE BODY CHRIS TRIG TRIGGER
现在你有了扳机。但是你仍然缺少它需要的PKGC!所以你必须再次从触发器中 “自上而下”...
如果您的表中有虚拟列,则这些依赖的任何PL/SQL也不会显示。
因此,除非有一个特定的原因,你只需要复制一些对象,你可能会更好地迁移所有的东西。另外请注意,您需要的对象可能在另一个用户中!
示例代码:
create table ta (
x int
);
create table tb (
x int
);
create table tc (
x int
);
create or replace view v as
select * from tc;
create sequence s;
create or replace package pkga as
procedure p;
end;
/
create or replace package pkgb as
procedure p;
end;
/
create or replace package pkgc as
procedure p;
end;
/
create or replace trigger trig
before insert on ta
begin
pkgc.p;
end;
/
create or replace package body pkga as
procedure p is
begin
pkgb.p;
insert into ta
select s.nextval from tb;
end;
end;
/
create or replace package body pkgb as
procedure p is
begin
for c in (select * from v) loop
null;
end loop;
end;
end;
/
create or replace package body pkgc as
procedure p is
begin
null;
end;
end;
/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




