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

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

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

qybjjes1

qybjjes11#

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

  1. sqlplus<<EOF
  2. set long 100000
  3. set head off
  4. set echo off
  5. set pagesize 0
  6. set verify off
  7. set feedback off
  8. spool schema.out
  9. select dbms_metadata.get_ddl(object_type, object_name, owner)
  10. from
  11. (
  12. --Convert DBA_OBJECTS.OBJECT_TYPE to DBMS_METADATA object type:
  13. select
  14. owner,
  15. --Java object names may need to be converted with DBMS_JAVA.LONGNAME.
  16. --That code is not included since many database don't have Java installed.
  17. object_name,
  18. decode(object_type,
  19. 'DATABASE LINK', 'DB_LINK',
  20. 'JOB', 'PROCOBJ',
  21. 'RULE SET', 'PROCOBJ',
  22. 'RULE', 'PROCOBJ',
  23. 'EVALUATION CONTEXT', 'PROCOBJ',
  24. 'CREDENTIAL', 'PROCOBJ',
  25. 'CHAIN', 'PROCOBJ',
  26. 'PROGRAM', 'PROCOBJ',
  27. 'SQL TRANSLATION PROFILE', 'PROCOBJ',
  28. 'REWRITE EQUIVALENCE', 'PROCOBJ',
  29. 'PACKAGE', 'PACKAGE_SPEC',
  30. 'PACKAGE BODY', 'PACKAGE_BODY',
  31. 'TYPE', 'TYPE_SPEC',
  32. 'TYPE BODY', 'TYPE_BODY',
  33. 'MATERIALIZED VIEW', 'MATERIALIZED_VIEW',
  34. 'QUEUE', 'AQ_QUEUE',
  35. 'JAVA CLASS', 'JAVA_CLASS',
  36. 'JAVA TYPE', 'JAVA_TYPE',
  37. 'JAVA SOURCE', 'JAVA_SOURCE',
  38. 'JAVA RESOURCE', 'JAVA_RESOURCE',
  39. 'XML SCHEMA', 'XMLSCHEMA',
  40. object_type
  41. ) object_type
  42. from dba_objects
  43. where owner in ('OWNER1')
  44. --These objects are included with other object types.
  45. and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION',
  46. 'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION')
  47. --Ignore system-generated types that support collection processing.
  48. and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%')
  49. --Exclude nested tables, their DDL is part of their parent table.
  50. and (owner, object_name) not in (select owner, table_name from dba_nested_tables)
  51. --Exclude overflow segments, their DDL is part of their parent table.
  52. and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW')
  53. )
  54. order by owner, object_type, object_name;
  55. spool off
  56. quit
  57. EOF
  58. cat schema.out|sed 's/OWNER1/MYOWNER/g'>schema.out.change.sql

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

展开查看全部
szqfcxe2

szqfcxe22#

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

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

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

字符串

--2.所有指数

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

--3.所有视图

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


  1. SELECT TEXT FROM USER_VIEWS

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

  1. SELECT QUERY FROM USER_MVIEWS

--5.所有功能

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

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

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

  1. SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER)
  2. FROM ALL_OBJECTS
  3. 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的查询,以便在选择时不返回包体。
到目前为止,我将查询改为:

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

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

9bfwbjaz

9bfwbjaz4#

首先导出模式元数据:

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

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

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

s71maibg

s71maibg5#

PACKAGE_BODY等对象存在问题:

  1. SELECT DBMS_METADATA.get_ddl(object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE';
  2. ORA-31600 invalid input value PACKAGE BODY parameter OBJECT_TYPE in function GET_DDL
  3. ORA-06512: на "SYS.DBMS_METADATA", line 4018
  4. ORA-06512: на "SYS.DBMS_METADATA", line 5843
  5. ORA-06512: на line 1
  6. 31600. 00000 - "invalid input value %s for parameter %s in function %s"
  7. *Cause: A NULL or invalid value was supplied for the parameter.
  8. *Action: Correct the input value and try the call again.
  9. SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type,' ','_'), object_name, owner)
  10. FROM all_OBJECTS
  11. WHERE (OWNER = 'OWNER1');

字符串

展开查看全部
os8fio9y

os8fio9y6#

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

  1. set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
  2. column ddl format a1000
  3. begin
  4. dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
  5. dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
  6. end;
  7. /
  8. variable v_username VARCHAR2(30);
  9. exec:v_username := upper('&1');
  10. select dbms_metadata.get_ddl('USER', u.username) AS ddl
  11. from dba_users u
  12. where u.username = :v_username
  13. union all
  14. select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
  15. from dba_ts_quotas tq
  16. where tq.username = :v_username
  17. and rownum = 1
  18. union all
  19. select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
  20. from dba_role_privs rp
  21. where rp.grantee = :v_username
  22. and rownum = 1
  23. union all
  24. select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
  25. from dba_sys_privs sp
  26. where sp.grantee = :v_username
  27. and rownum = 1
  28. union all
  29. select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
  30. from dba_tab_privs tp
  31. where tp.grantee = :v_username
  32. and rownum = 1
  33. union all
  34. select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
  35. from dba_role_privs rp
  36. where rp.grantee = :v_username
  37. and rp.default_role = 'YES'
  38. and rownum = 1
  39. union all
  40. select to_clob('/* Start profile creation script in case they are missing') AS ddl
  41. from dba_users u
  42. where u.username = :v_username
  43. and u.profile <> 'DEFAULT'
  44. and rownum = 1
  45. union all
  46. select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
  47. from dba_users u
  48. where u.username = :v_username
  49. and u.profile <> 'DEFAULT'
  50. union all
  51. select to_clob('End profile creation script */') AS ddl
  52. from dba_users u
  53. where u.username = :v_username
  54. and u.profile <> 'DEFAULT'
  55. and rownum = 1
  56. /
  57. set linesize 80 pagesize 14 feedback on trimspool on verify on

字符串

展开查看全部
zlhcx6iw

zlhcx6iw7#

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

  1. clear screen
  2. accept uname prompt 'Enter User Name : '
  3. accept outfile prompt ' Output filename : '
  4. spool &&outfile..gen
  5. SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON
  6. BEGIN
  7. DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
  8. DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
  9. END;
  10. /
  11. SELECT dbms_metadata.get_ddl('USER','&&uname') FROM dual;
  12. SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','&&uname') from dual;
  13. SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','&&uname') from dual;
  14. SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','&&uname') from dual;
  15. spool off

字符串

展开查看全部

相关问题