如何生成Oracle模式的整个子目录(可脚本化)?

ztigrdn8  于 2023-11-17  发布在  Oracle
关注(0)|答案(7)|浏览(164)

有谁能告诉我如何为Oracle模式中的所有表、视图、索引、包、过程、函数、触发器、类型、序列、同义词、赠款等生成一个复制表吗?理想情况下,我也想复制行,但这并不重要。
我想在某种类型的计划作业上执行此操作,而不是每次都手动执行,这样就排除了在SQL Developer中使用向导的可能性。
理想情况下,由于我将在几个具有赠款和同义词的模式上运行此程序,因此我希望有一种方法在输出中执行查找/替换,以便模式名称与新模式的名称相匹配。
谢谢你,谢谢

qybjjes1

qybjjes11#

您可以通过SQL*Plus和dbms_metadata包将模式拖放到文件中。然后通过sed将模式名称替换为另一个名称。这适用于Oracle 10及更高版本。

sqlplus<<EOF
set long 100000
set head off
set echo off
set pagesize 0
set verify off
set feedback off
spool schema.out

select dbms_metadata.get_ddl(object_type, object_name, owner)
from
(
    --Convert DBA_OBJECTS.OBJECT_TYPE to DBMS_METADATA object type:
    select
        owner,
        --Java object names may need to be converted with DBMS_JAVA.LONGNAME.
        --That code is not included since many database don't have Java installed.
        object_name,
        decode(object_type,
            'DATABASE LINK',           'DB_LINK',
            'JOB',                     'PROCOBJ',
            'RULE SET',                'PROCOBJ',
            'RULE',                    'PROCOBJ',
            'EVALUATION CONTEXT',      'PROCOBJ',
            'CREDENTIAL',              'PROCOBJ',
            'CHAIN',                   'PROCOBJ',
            'PROGRAM',                 'PROCOBJ',
            'SQL TRANSLATION PROFILE', 'PROCOBJ',
            'REWRITE EQUIVALENCE',     'PROCOBJ',
            'PACKAGE',                 'PACKAGE_SPEC',
            'PACKAGE BODY',            'PACKAGE_BODY',
            'TYPE',                    'TYPE_SPEC',
            'TYPE BODY',               'TYPE_BODY',
            'MATERIALIZED VIEW',       'MATERIALIZED_VIEW',
            'QUEUE',                   'AQ_QUEUE',
            'JAVA CLASS',              'JAVA_CLASS',
            'JAVA TYPE',               'JAVA_TYPE',
            'JAVA SOURCE',             'JAVA_SOURCE',
            'JAVA RESOURCE',           'JAVA_RESOURCE',
            'XML SCHEMA',              'XMLSCHEMA',
            object_type
        ) object_type
    from dba_objects 
    where owner in ('OWNER1')
        --These objects are included with other object types.
        and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION',
           'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION')
        --Ignore system-generated types that support collection processing.
        and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%')
        --Exclude nested tables, their DDL is part of their parent table.
        and (owner, object_name) not in (select owner, table_name from dba_nested_tables)
        --Exclude overflow segments, their DDL is part of their parent table.
        and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW')
)
order by owner, object_type, object_name;

spool off
quit
EOF

cat schema.out|sed 's/OWNER1/MYOWNER/g'>schema.out.change.sql

字符串
将所有内容放入脚本中,并通过cron(调度程序)运行它。当使用高级功能时,导出对象可能会很棘手。如果您需要向上述代码添加更多异常,请不要感到惊讶。

szqfcxe2

szqfcxe22#

如果您想为每个对象单独生成ddl,
工作人员:

--为所有用户群生成查询
--1.所有表格

SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;

字符串

--2.所有指数

SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';

--3.所有视图

SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;


SELECT TEXT FROM USER_VIEWS

--4.对于所有已验证的视图

SELECT QUERY FROM USER_MVIEWS

--5.所有功能

SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'

GET_VIEW函数不支持某些对象类型,如LOB、吸收视图、表分区

因此,生成订单的合并查询将是:

SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER)
  FROM ALL_OBJECTS 
  WHERE (OWNER = 'XYZ') AND OBJECT_TYPE NOT IN('LOB','MATERIALIZED VIEW', 'TABLE PARTITION') ORDER BY OBJECT_TYPE, OBJECT_NAME;

ar7v8xwq

ar7v8xwq3#

PACKAGE的get_ddl过程将返回spec和body,因此最好更改对all_objects的查询,以便在选择时不返回包体。
到目前为止,我将查询改为:

SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type, ' ', '_'), object_name, owner)
FROM all_OBJECTS
WHERE (OWNER = 'OWNER1')
and object_type not like '%PARTITION'
and object_type not like '%BODY'
order by object_type, object_name;

字符串
虽然可能需要根据您获取的对象类型进行其他更改.

9bfwbjaz

9bfwbjaz4#

首先导出模式元数据:

expdp dumpfile=filename logfile=logname directory=dir_name schemas=schema_name

字符串
然后使用sqlfile选项导入(它不会导入数据,它只会将模式文件写入该文件)

impdp dumpfile=filename logfile=logname directory=dir_name sqlfile=ddl.sql

s71maibg

s71maibg5#

PACKAGE_BODY等对象存在问题:

SELECT DBMS_METADATA.get_ddl(object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE';

ORA-31600 invalid input value PACKAGE BODY parameter OBJECT_TYPE in function GET_DDL
ORA-06512: на  "SYS.DBMS_METADATA", line 4018
ORA-06512: на  "SYS.DBMS_METADATA", line 5843
ORA-06512: на  line 1
31600. 00000 -  "invalid input value %s for parameter %s in function %s"
*Cause:    A NULL or invalid value was supplied for the parameter.
*Action:   Correct the input value and try the call again.


SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type,' ','_'), object_name, owner)
  FROM all_OBJECTS 
  WHERE (OWNER = 'OWNER1');

字符串

os8fio9y

os8fio9y6#

要为整个SCHEMA(即USER)生成SQL脚本,可以使用dbms_metadata.get_ddl
Tim Hall创建的SQL*Plus中执行以下脚本:
提示时提供用户名

set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000

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

variable v_username VARCHAR2(30);

exec:v_username := upper('&1');

select dbms_metadata.get_ddl('USER', u.username) AS ddl
from   dba_users u
where  u.username = :v_username
union all
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
from   dba_ts_quotas tq
where  tq.username = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
from   dba_sys_privs sp
where  sp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
from   dba_tab_privs tp
where  tp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rp.default_role = 'YES'
and    rownum = 1
union all
select to_clob('/* Start profile creation script in case they are missing') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
union all
select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
union all
select to_clob('End profile creation script */') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
/

set linesize 80 pagesize 14 feedback on trimspool on verify on

字符串

zlhcx6iw

zlhcx6iw7#

此查询的输出非常干净(原始here

clear screen
accept uname prompt 'Enter User Name : '
accept outfile prompt  ' Output filename : '

spool &&outfile..gen

SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON

BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
END;
/

SELECT dbms_metadata.get_ddl('USER','&&uname') FROM dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','&&uname') from dual;

spool off

字符串

相关问题