Lưu trữ và backup sự thay đổi của các package của hệ thống ORACLE (hoặc procedure, function…)

Lưu trữ và backup sự thay đổi của các package của hệ thống ORACLE (hoặc procedure, function…)

Đứng vai trò là một Delevlop Database, trong Database công ty sẽ có rất nhiều các pakage, các package này cũng không chỉ có mỗi một mình sửa mà cả team cùng sửa. Cũng giống như code, việc này hay xảy ra conflic khi build gây lỗi cả hệ thống.

Hoặc đơn giản hơn, trước khi sửa ta luôn phải lưu package lại trước khi sửa. Vì nhiều lúc không phải lúc nào cũng có hệ thống test để có thể làm việc được.

Để tự động hóa việc lưu trữ cũng như lưu được lịch sử sửa đổi package, mình sẽ thực hiện 1 tiến trình như sau:
– Bước 1: hàng ngày hoặc nửa ngày 1 lần, tiến hành extract từng package ra 1 file sql hoặc text để tiến hành lưu trữ
– Bước 2: Hoặc là lưu trữ toàn bộ lại theo từng lần. Hoặc tiến hành đưa vào source quản lý mã nguồn.
Từ đây ta có thể dễ dàng tra cứu lại hoặc tiến hành khôi phục lại (rollback) code sql mà ta có thể đã làm lỗi gì đó.

Đây là 1 procedure mà mình đã tạo:
– Lấy toàn bộ các package có tên bắt đầu P_VN để tiến hành backup
– Lấy mã nguồn từng package lưu vào file có tên là tên package và lưu trữ vào thư mục: EXTRACT_2018 (tên biến trong oracle maps vào ổ cứng, mình đã có 1 bài viết về cái này, bạn có thể xem tại: …)

CREATE OR REPLACE PROCEDURE pro_flat_export
IS
l_clob CLOB;
l_name VARCHAR2(300);
rc sys_refcursor;
l_buffer VARCHAR2 (32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
wquery varchar2(3000);
col1 varchar2(500);
cursor c_getdata is
SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE IN (‘PACKAGE’) and OBJECT_NAME like ‘P_VN%’;
BEGIN
for i_getdata in c_getdata loop
col1:=i_getdata.OBJECT_NAME;
select dbms_metadata.get_ddl(‘PACKAGE’,col1,USER) into l_clob from dual;
DBMS_XSLPROCESSOR.clob2file (l_clob, ‘EXTRACT_2018′, col1||’.sql’);
end loop;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
END;

Ta có thể chạy định kỳ thủ tục này hoặc cần thì chạy:
begin
pro_flat_export();
end;

Ý tưởng để quản lý mã nguồn giống như quản lý mã nguồn cho code lập trình, ta sử dụng SVN hoặc GIT.
Ta tạo GIT bình thường, khi chạy tạo ra các file mới này ta đẩy vào thư mục GIT để thay thế code cũ. Sau đó tiến hành commit lên thôi, vì đây ta lưu ra txt hoặc sql nên có xem lại được theo version.

Oracle Check package modified and execute

Oracle Check package modified and execute

ALTER SESSION SET NLS_DATE_FORMAT=’DD-MM-YYYY HH24:MI:SS’;

 

— Daily object modified report every 24h

SELECT owner,

object_name,

object_type,

last_ddl_time,

status

FROM dba_objects

WHERE     object_name IN

(SELECT A.REFERENCED_NAME

FROM DBA_DEPENDENCIES a

WHERE object_type IN (‘PROCEDURE’, ‘PACKAGE BODY’, ‘PACKAGE’))

AND last_ddl_time >= SYSDATE – 2

ORDER BY last_ddl_time DESC;

 

— INVALID Object modified report every 30 minutes

SELECT owner,

object_name,

object_type,

last_ddl_time,

status

FROM dba_objects

WHERE     object_name IN

(SELECT A.REFERENCED_NAME

FROM DBA_DEPENDENCIES a

WHERE     object_type IN

(‘PROCEDURE’, ‘PACKAGE BODY’, ‘PACKAGE’)

AND status = ‘INVALID’)

AND last_ddl_time >= SYSDATE – 2

ORDER BY last_ddl_time DESC;