ORA-23309。Embarcadero Change Manager、OEM DB-Diff,但授權昂貴且非隨處可用。
-- 需先建立 DB Link:ora_zs、ora_sjjk
SET LINESIZE 80 VERIFY OFF FEEDBACK OFF PAUSE OFF
ACCEPT obj_owner PROMPT '物件擁有者: '
ACCEPT inst_1_dblink PROMPT '第一實例 DB Link (含@): '
ACCEPT inst_2_dblink PROMPT '第二實例 DB Link (含@): '
COLUMN datetime NEW_VALUE datetime NOPRINT
COLUMN inst_code1_name NEW_VALUE inst_code1_name NOPRINT
COLUMN inst_code2_name NEW_VALUE inst_code2_name NOPRINT
SELECT TO_CHAR(SYSDATE,'MM/DD/YY') datetime FROM DUAL;
SELECT GLOBAL_NAME inst_code1_name FROM GLOBAL_NAME&inst_1_dblink;
SELECT GLOBAL_NAME inst_code2_name FROM GLOBAL_NAME&inst_2_dblink;
TTITLE CENTER '物件比較報告' SKIP 1 -
CENTER '物件在 &inst_code1_name 但不在 &inst_code2_name' SKIP 2
COL OBJECT_TYPE FORMAT A15 HEAD '類型'
COL OBJECT_NAME FORMAT A35 HEAD '名稱'
COL STATUS FORMAT A10 HEAD '狀態'
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_1_dblink
WHERE OWNER = UPPER('&OBJ_OWNER') AND OBJECT_TYPE != 'SYNONYM'
MINUS
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_2_dblink
WHERE OWNER = UPPER('&OBJ_OWNER') AND OBJECT_TYPE != 'SYNONYM'
ORDER BY 2,3;
TTITLE CENTER '物件比較報告' SKIP 1 -
CENTER '物件在 &inst_code2_name 但不在 &inst_code1_name' SKIP 2
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_2_dblink
WHERE OWNER = UPPER('&OBJ_OWNER') AND OBJECT_TYPE != 'SYNONYM'
MINUS
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_1_dblink
WHERE OWNER = UPPER('&OBJ_OWNER') AND OBJECT_TYPE != 'SYNONYM'
ORDER BY 2,3;
將 ALL_OBJECTS 換為 ALL_TAB_COLUMNS,比較 COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT 等屬性,同樣用 MINUS 雙向比對。
MINUS 語意清晰、效能佳。