如何将oraclesql中的存储过程从一个模式移动到另一个模式?

nnt7mjpx  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(534)

我试图理解为了将存储过程从一个模式移动到另一个模式,需要执行哪些步骤。这个模式现在是多余的,我被要求移动所有的表和过程。我对表格没有问题,但从来没有做过任何程序,因此我想确保我不会错过任何东西。
我目前所做的是浏览整个过程,并列出它实际上在做什么,即删除/创建数据并将数据插入表中。
在此之后,我不确定这是否只是复制过程代码,然后在新模式上用相同的代码创建一个新过程,然后编译它。
如果有人能告诉我,在我所采取的步骤中是否遗漏了什么,我会非常感激,以确保我不会把事情搞砸。

f3temu5u

f3temu5u1#

无法将对象从一个模式“移动”到另一个模式。
我在这里看到的唯一可行的方法是复制源代码,然后在新模式中执行它。正如@pmdba作为注解编写的那样,您应该注意诸如“myschema”、“tablename”和其他引用之类的模式名称。
如果要复制的内容太多,可以考虑编写一个块,自动读取旧模式的数据并在新模式中自动创建它。您可以通过以下步骤获得(几乎)所有数据:

select * from all_source where owner = 'OLDSCHEMANAME' and type = 'PROCEDURE';

像这样使用:

begin
    ....
    select listagg(text, '') within group (order by line) into proc_code
    from all_source
    where owner = 'OLDSCHEMANAME'
        and type = 'PROCEDURE'
    group by name;

    execute immediate 'create or replace ' || proc_code; -- perhaps you need to remove the last ';' here
    ...
end;

请注意,这段代码只是作为一个提示,并不需要采取确切的方式。此外,由于不存在的对象、错误的模式引用等原因,仍然可能会出现错误。。
要获得表的ddl,可以使用 select dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name') from dual; . 通过google dbms\u metadata.get\u ddl,您可能会获得有关dbms\u metadata-package以及如何正确使用它的更多信息。

ny6fqffe

ny6fqffe2#

如前所述,没有将一个对象(过程、函数或包等)复制到另一个模式的机制。另一种方法是使用all\ u源,但我更喜欢dbms\ u元数据,因为它允许您传输所有依赖项,例如特权。想象一下,我需要复制一个过程,但我需要保留特权,有了这个包,我可以得到一切。
例子

SQL> create procedure myschema1.my_procedure ( p1 number )
  2  as
  3  var1 number := p1;
  4  begin
  5  select 1 into var1 from dual;
  6  end;
  7  /

Procedure created.

SQL> grant execute on myschema1.my_procedure to myuser ;

Grant succeeded.

现在,假设我们想将过程及其权限复制到另一个模式

SQL> set long 99999999 set lines 200 pages 400
SQL> select dbms_metadata.get_ddl('PROCEDURE','MY_PROCEDURE','MYSCHEMA1') from dual ;

DBMS_METADATA.GET_DDL('PROCEDURE','MY_PROCEDURE','MYSCHEMA1')
--------------------------------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PROCEDURE "MYSCHEMA1"."MY_PROCEDURE" ( p1 number )
   as
var1 number := p1;
begin
select 1 into var1 from dual;
end;

但是,想象一下你不需要引用,也不需要可编辑的论点

SQL> select 
replace(dbms_metadata.get_ddl('PROCEDURE','MY_PROCEDURE','MYSCHEMA1','11.2.0'),'"','') as ddl from dual ;

DDL
--------------------------------------------------------------------------------

  CREATE OR REPLACE PROCEDURE MYSCHEMA1.MY_PROCEDURE ( p1 number )
as
var1 number := p1;
begin
select 1 into var1 from dual;
end;

然后,为了获得具有新模式所有者的最终命令,我们使用regexp\u replace替换第一个出现的命令

SQL> select regexp_replace(replace(dbms_metadata.get_ddl('PROCEDURE','MY_PROCEDURE','MYSCHEMA1','11.2.0'),'"',''),'MYSCHEMA1','MYSCHEMA2',1,1)
  2  as ddl from dual ;

DDL
--------------------------------------------------------------------------------

  CREATE OR REPLACE PROCEDURE MYSCHEMA2.MY_PROCEDURE ( p1 number )
as
var1 number := p1;
begin
select 1 into var1 from dual;
end;

最后,我们可以通过

SQL> select dbms_metadata.get_dependent_ddl( 'OBJECT_GRANT' , 'MY_PROCEDURE' , 'MYSCHEMA1' ) from dual ;

DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','MY_PROCEDURE','MYSCHEMA1')
--------------------------------------------------------------------------------

  GRANT EXECUTE ON "MYSCHEMA1"."MY_PROCEDURE" TO "MYUSER"

在启动某些设置以增强dbms\U元数据输出之前,请记住在会话级别应用:

begin
  DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
  DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
end;

相关问题