如何从oracle数据库获取对象副本
我计划发布我们的产品。我们正在使用Oracle表单开发我们的软件 所以我有两种类型的对象要释放如何从oracle数据库获取对象副本,oracle,oracle10g,oracle9i,release-management,oracleforms,Oracle,Oracle10g,Oracle9i,Release Management,Oracleforms,我计划发布我们的产品。我们正在使用Oracle表单开发我们的软件 所以我有两种类型的对象要释放 前端=>Oracle表单 后端=>Oracle数据库程序(过程、函数和包) 发布的一个重要部分是我们需要一个备份,这样如果发生任何事情,我们可以使用旧版本 顺便说一下,对于前端对象,我将使用一些批处理文件为我的前端对象创建备份,但是对于后端对象,我不知道如何自动获取函数、过程或包(规范和主体)的副本 你知道我怎么能自动完成吗?请告诉我。 我们正在使用oracle 10g&9i(对代码块表示歉意) 以下
PROCEDURE DUMP_CLOB(aCLOB IN CLOB,
hOutput_file IN UTL_FILE.FILE_TYPE) IS
nCLOB_length NUMBER;
nCLOB_offset NUMBER := 1;
nMax_chunk_size NUMBER := 32767;
strChunk VARCHAR2(32767);
BEGIN
nCLOB_length := DBMS_LOB.GETLENGTH(aCLOB);
WHILE nCLOB_offset <= nCLOB_length LOOP
strChunk := DBMS_LOB.SUBSTR(aCLOB, nMax_chunk_size, nCLOB_offset);
UTL_FILE.PUT(hOutput_file, strChunk);
nCLOB_offset := nCLOB_offset + LENGTH(strChunk);
END LOOP;
UTL_FILE.PUT_LINE(hOutput_file, ';');
END DUMP_CLOB;
PROCEDURE DUMP_PRIVS(strOwner IN VARCHAR2,
strObject_name IN VARCHAR2,
hOutput_file IN UTL_FILE.FILE_TYPE) IS
BEGIN
FOR pRow IN (SELECT *
FROM DBA_TAB_PRIVS p
WHERE p.OWNER = strOwner AND
p.TABLE_NAME = strObject_name)
LOOP
UTL_FILE.PUT_LINE(hOutput_file, 'GRANT ' || pRow.PRIVILEGE || ' ON ' ||
strOwner || '.' || strObject_name ||
' TO ' || pRow.GRANTEE || ';');
END LOOP;
END DUMP_PRIVS;
PROCEDURE DUMP_OBJECT(strOwner IN VARCHAR2,
strObject_name IN VARCHAR2,
hOutput_file IN UTL_FILE.FILE_TYPE)
IS
clobDDL CLOB;
strCurr_object_name VARCHAR2(100);
BEGIN
FOR rowObject IN (SELECT *
FROM SYS.DBA_OBJECTS o
WHERE o.OWNER = strOwner AND
o.OBJECT_NAME = strObject_name AND
o.OBJECT_TYPE <> 'TABLE PARTITION')
LOOP
strCurr_object_name := NVL(rowObject.SUBOBJECT_NAME, rowObject.OBJECT_NAME);
UTL_FILE.PUT_LINE(hOutput_file, '-- DDL for ' || LOWER(rowObject.OBJECT_TYPE) || ' ' ||
strOwner || '.' || strCurr_object_name);
SELECT DBMS_METADATA.GET_DDL(rowObject.OBJECT_TYPE, strCurr_object_name, strOwner) AS DDL
INTO clobDDL
FROM DUAL;
DUMP_CLOB(clobDDL, hOutput_file);
DUMP_PRIVS(strOwner, strCurr_object_name, hOutput_file);
IF rowObject.OBJECT_TYPE = 'TABLE' THEN
-- Indexes
FOR aRow IN (SELECT DBMS_METADATA.GET_DDL('INDEX', i.INDEX_NAME, i.OWNER) AS clobIndex
FROM DBA_INDEXES I
WHERE I.TABLE_OWNER = strOwner AND
I.TABLE_NAME = strCurr_object_name)
LOOP
DUMP_CLOB(aRow.clobIndex, hOutput_file);
END LOOP; -- Indexes
END IF;
IF rowObject.OBJECT_TYPE IN ('TABLE', 'VIEW') THEN
-- Triggers
FOR aRow IN (SELECT DBMS_METADATA.GET_DDL('TRIGGER', t.TRIGGER_NAME, t.OWNER) AS clobTrigger
FROM DBA_TRIGGERS t
WHERE TABLE_OWNER = strOwner AND
TABLE_NAME = strCurr_object_name)
LOOP
DUMP_CLOB(aRow.clobTrigger, hOutput_file);
END LOOP; -- Triggers
END IF;
END LOOP;
END DUMP_OBJECT;
PROCEDURE DUMP_OBJECT(strOwner IN VARCHAR2,
strObject_name IN VARCHAR2,
strDirectory_name IN VARCHAR2,
strFilename IN VARCHAR2,
strOpen_mode IN VARCHAR2 DEFAULT 'w')
IS
hOutput_file UTL_FILE.FILE_TYPE;
BEGIN
hOutput_file := UTL_FILE.FOPEN(location => strDirectory_name,
filename => strFilename,
open_mode => strOpen_mode);
DUMP_OBJECT(strOwner, strObject_name, hOutput_file);
UTL_FILE.FCLOSE(hOutput_file);
EXCEPTION
WHEN OTHERS THEN
UTL_FILE.FCLOSE(hOutput_file);
RAISE;
END DUMP_OBJECT;
过程转储\u CLOB(CLOB中的aCLOB,
UTL_文件中的hOutput_文件。文件类型)为
nCLOB_长度数;
nCLOB_偏移数:=1;
nMax\u块大小编号:=32767;
施图克·瓦尔查尔2(32767);
开始
nCLOB_length:=DBMS_LOB.GETLENGTH(aCLOB);
nCLOB_offset strDirectory_name时,
filename=>strFilename,
打开_模式=>strOpen_模式);
DUMP_对象(strOwner、strObject_名称、hOutput_文件);
UTL_文件.FCLOSE(hOutput_文件);
例外情况
当其他人
UTL_文件.FCLOSE(hOutput_文件);
提高;
结束转储对象;
我建议将这些程序打包。调用DUMP_OBJECT以获取要转储的内容
分享和享受
“在我的公司,有时开发人员会应用一些软件包或功能
在webbex期间,因此有时客户生产与我们的不同
pvcs。”
那么,在存储库中存储代码有什么意义呢?测试配置的意义是什么?发布管理的意义是什么
如果这些混混在客户生产环境中的牛仔开发人员是您的员工,那么您需要约束他们。强制执行流程以确保仅部署经过认证的配置。如果需要紧急调整,则应将其改装到正式版本中
如果这些开发人员真的为客户工作,那么我想你不能阻止他们。但你不必支持他们,也不必为他们的改变负责。(除非销售合同规定必须这样做,这不会让我感到惊讶。)从ALL_SOURCE中选择字段,其中Name=ObjectName将用于除触发器以外的任何操作。从所有触发器中选择字段将对触发器起作用。在您使用新对象和您的操作完成之前,请将这些值存储到“备份”表中。虽然我相信DBA有更好的方法。你不是在使用源代码管理工具来管理你的代码吗?@APC:我们使用PVCS来跟踪我们的版本,但我希望立即采取行动,以支持客户方面的一切。在我的公司,有时开发人员在webbex期间应用一些包或功能,因此有时客户生产与我们的PVC不同。(1或2种情况)。你有发行方面的经验吗?你能给我一些建议吗?请你的DBA团队导出模式,你会得到所有对象的副本,其中的数据我听说Oracle数据库可以在以后备份和恢复。我同意你的看法,但相信我,他们不知道配置管理在公司中的价值,这就是为什么有时候会发生这样的问题。顺便说一下,我们试图找出它们并阻止它们。。。我们的管理层不清楚如何惩罚他们。。。其他公司是如何惩罚这种开发者的?@rima-很抱歉,但就公司的纪律程序向您提供建议是远远偏离主题的。我的建议是:如果你的同事不了解正当程序的重要性,你的经理现在不知道如何正确执行政策,那么也许是时候找一个新雇主了?我想,但在马来西亚我真的找不到任何CM工作:(就在美国!目前在这里工作对我来说太有价值了:)如果你有任何朋友,请向我介绍:)你能告诉我str owner和directory_name的区别吗?object_name和filename的区别是什么?strOwner是你要转储的对象所在的模式。strDirectory_name是文件系统中的一个目录名,可通过要在其中创建文件的UTL_文件访问该目录。strFilename是要创建的文件的名称,DDL将写入该文件。