Blocul de instalare/migrare Oracle 21c XE, terminat si validat pe VM 302. Kit de instalare (nou) scripts/build-client-kit.ps1 exporta CONTAFIN_ORACLE si FIRMANOUA de pe LXC 108 (PDB ROA2, nu ROA - ROA e productia ROA_CENTRAL), le aduce local prin cele trei hopuri container -> LXC -> host -> statie, le redenumeste la numele pe care le asteapta scripturile si le impacheteaza cu o copie a directorului roa-windows-setup. Citeste logul expdp si raporteaza cate firme are NOM_FIRME, ca sa nu plece din greseala datele unui client. roa-windows-setup/INSTALEAZA.cmd ruleaza pasii 01..08 fara "set /p", deci merge si prin SSH - RunAll.cmd nu poate fi rulat neinteractiv. Trateaza corect codul 5 de la pasul 03 si se opreste la prima eroare reala. Corectii 01-setup-database.ps1 nu mai scrie SQLNET.RECV_TIMEOUT / SEND_TIMEOUT in sqlnet.ora. Le hardcoda la 30 s, iar fisierul e citit si de impdp: in timpul unui import serverul poate lucra minute fara sa trimita un pachet, clientul murea cu ORA-12609 iar scriptul raporta esec pentru un import care se terminase cu bine pe server. Reprodus si reparat pe VM 302. 01-setup-database.ps1: Step 4c optional (-ResetSystemPassword) care curata EXPIRED(GRACE) pe SYSTEM in CDB root; ALTER PROFILE opreste expirarile viitoare dar nu reseteaza un cont deja intrat in gratie. uninstall-roa.sql: retry la DROP USER dupa KILL SESSION, plus un bloc final de verdict care numara ce a ramas si iese cu ORA-20900 daca baza nu e curata. Pana acum toate sectiunile prindeau exceptiile in WHEN OTHERS si scriptul tiparea "UNINSTALL COMPLETE" chiar si cand un user supravietuise, iar instalarea urmatoare dadea ORA-31684 in lant. 99-uninstall-roa.ps1 propaga codul de iesire. 08-post-install-config.ps1: Step 7b seteaza SMTP_OUT_SERVER si ACL-ul de retea pentru CONTAFIN_ORACLE. UTL_MAIL se instala si primea EXECUTE, adica destul cat sa compileze, dar nu si cat sa trimita. Privilegiul resolve nu accepta interval de porturi (ORA-24244), deci se acorda separat de connect. 07-verify-installation.ps1: sectiune noua care verifica prezenta lui FIRMANOUA.dmp in DMPDIR si o raporteaza ca eroare daca lipseste. Fara el, adaugarea unei firme noi pica in DBMS_DATAPUMP.ADD_FILE peste luni de la instalare, cand nimeni nu mai leaga eroarea de instalare. configure-profile.sql: antetul spune ca e unealta de remediere manuala, nu parte din flux; pas nou la final pentru CDB root. Documentatie README-ul roa-windows-setup descrie acum explicit cele doua scenarii - instalare pe curat si migrare - de unde se iau DMP-urile sablon, si capcana ORA-12609. Handoff-urile de sesiune au fost sterse; ce era durabil in ele a intrat in README-uri si in docs/diagnostic-spatiu-clienti.md. Validare pe VM 302: ciclu complet din kit, instalare pe curat, verificarea finala "[OK] All checks passed!". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
475 lines
19 KiB
SQL
475 lines
19 KiB
SQL
-- ============================================================================
|
|
-- ROA UNINSTALL SCRIPT
|
|
-- ============================================================================
|
|
-- Removes all ROA application objects from Oracle database:
|
|
-- - Company users (schemas using ROA tablespace or CONTAFIN_ORACLE synonyms)
|
|
-- - CONTAFIN_ORACLE user and all objects
|
|
-- - Public synonyms pointing to CONTAFIN_ORACLE
|
|
-- - SYS custom objects (AUTH_PACK, AUTH_SERII, etc.)
|
|
-- - Application context SESIUNE
|
|
-- - Tablespace ROA
|
|
--
|
|
-- Usage:
|
|
-- sqlplus sys/password@service as sysdba @uninstall-roa.sql
|
|
--
|
|
-- WARNING: This script PERMANENTLY DELETES all ROA data!
|
|
-- ============================================================================
|
|
|
|
SET ECHO OFF
|
|
SET FEEDBACK ON
|
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
|
WHENEVER SQLERROR CONTINUE
|
|
|
|
PROMPT
|
|
PROMPT ============================================================
|
|
PROMPT ROA UNINSTALL - REMOVING ALL ROA OBJECTS
|
|
PROMPT ============================================================
|
|
PROMPT
|
|
PROMPT WARNING: This will permanently delete all ROA data!
|
|
PROMPT Press Ctrl+C within 5 seconds to abort...
|
|
PROMPT
|
|
EXEC DBMS_SESSION.SLEEP(5);
|
|
|
|
-- ============================================================================
|
|
-- HELPER: Kill all sessions for a given username
|
|
-- ============================================================================
|
|
CREATE OR REPLACE PROCEDURE roa_kill_user_sessions(p_username IN VARCHAR2) IS
|
|
v_count NUMBER := 0;
|
|
BEGIN
|
|
FOR r IN (SELECT sid, serial# FROM v$session WHERE username = UPPER(p_username)) LOOP
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || r.sid || ',' || r.serial# || ''' IMMEDIATE';
|
|
v_count := v_count + 1;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN NULL;
|
|
END;
|
|
END LOOP;
|
|
IF v_count > 0 THEN
|
|
DBMS_OUTPUT.PUT_LINE(' Killed ' || v_count || ' session(s) for ' || p_username);
|
|
DBMS_SESSION.SLEEP(1); -- Wait for sessions to terminate
|
|
END IF;
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 1: DROP COMPANY USERS
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [1/6] Dropping company users...
|
|
PROMPT ============================================================
|
|
|
|
DECLARE
|
|
CURSOR c_users IS
|
|
SELECT DISTINCT username
|
|
FROM dba_users
|
|
WHERE username NOT IN (
|
|
-- Oracle internal users
|
|
'SYS', 'SYSTEM', 'OUTLN', 'DIP', 'ORACLE_OCM', 'DBSNMP', 'APPQOSSYS',
|
|
'WMSYS', 'EXFSYS', 'CTXSYS', 'ANONYMOUS', 'XDB', 'ORDPLUGINS',
|
|
'ORDSYS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'OLAPSYS', 'MDDATA',
|
|
'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR', 'SYSMAN',
|
|
'MGMT_VIEW', 'APEX_PUBLIC_USER', 'APEX_040000', 'APEX_040200',
|
|
'FLOWS_FILES', 'OWBSYS', 'OWBSYS_AUDIT', 'SCOTT', 'HR', 'OE',
|
|
'SH', 'PM', 'IX', 'BI', 'XS$NULL', 'GSMADMIN_INTERNAL',
|
|
'GSMUSER', 'GSMCATUSER', 'SYSBACKUP', 'SYSDG', 'SYSKM',
|
|
'SYSRAC', 'SYS$UMF', 'DBSFWUSER', 'REMOTE_SCHEDULER_AGENT',
|
|
'PDBADMIN', 'GGSHAREDCAP', 'LBACSYS', 'DVF', 'DVSYS',
|
|
'AUDSYS', 'DGPDB_INT', 'GGSYS', 'OJVMSYS', 'ORDDATA',
|
|
-- ROA main user (dropped separately)
|
|
'CONTAFIN_ORACLE'
|
|
)
|
|
AND username NOT LIKE 'APEX%'
|
|
AND username NOT LIKE 'FLOWS%'
|
|
AND username NOT LIKE 'OWB%'
|
|
AND username NOT LIKE 'C##%'
|
|
AND (
|
|
-- Users with ROA tablespace
|
|
default_tablespace = 'ROA'
|
|
-- OR users that have synonyms pointing to CONTAFIN_ORACLE (company schemas)
|
|
OR username IN (
|
|
SELECT DISTINCT owner
|
|
FROM dba_synonyms
|
|
WHERE table_owner = 'CONTAFIN_ORACLE'
|
|
AND owner NOT IN ('PUBLIC', 'SYS', 'SYSTEM')
|
|
)
|
|
)
|
|
ORDER BY username;
|
|
v_count NUMBER := 0;
|
|
v_failed NUMBER := 0;
|
|
BEGIN
|
|
FOR r IN c_users LOOP
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE(' Processing: ' || r.username);
|
|
-- Kill sessions first
|
|
roa_kill_user_sessions(r.username);
|
|
-- Drop user
|
|
EXECUTE IMMEDIATE 'DROP USER ' || r.username || ' CASCADE';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped user: ' || r.username);
|
|
v_count := v_count + 1;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
-- O sesiune agatata tine userul ocupat (ORA-01940 "cannot drop a
|
|
-- user that is currently connected"). Prima incercare poate pica
|
|
-- inainte ca ALTER SYSTEM KILL SESSION sa fi terminat efectiv.
|
|
-- Mai incercam o data; ce ramane e raportat si prins de
|
|
-- verificarea finala, care iese cu cod de eroare.
|
|
DBMS_OUTPUT.PUT_LINE(' WARN (incercarea 1): ' || SQLERRM);
|
|
BEGIN
|
|
roa_kill_user_sessions(r.username);
|
|
DBMS_SESSION.SLEEP(3);
|
|
EXECUTE IMMEDIATE 'DROP USER ' || r.username || ' CASCADE';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped user (retry): ' || r.username);
|
|
v_count := v_count + 1;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
v_failed := v_failed + 1;
|
|
DBMS_OUTPUT.PUT_LINE(' ERROR: ' || r.username ||
|
|
' NU a fost sters: ' || SQLERRM);
|
|
END;
|
|
END;
|
|
END LOOP;
|
|
DBMS_OUTPUT.PUT_LINE('Total company users dropped: ' || v_count);
|
|
IF v_failed > 0 THEN
|
|
DBMS_OUTPUT.PUT_LINE('ATENTIE: ' || v_failed || ' user(i) de firma NU au fost stersi.');
|
|
END IF;
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 2: DROP CONTAFIN_ORACLE USER
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [2/6] Dropping CONTAFIN_ORACLE user...
|
|
PROMPT ============================================================
|
|
|
|
DECLARE
|
|
v_count NUMBER;
|
|
BEGIN
|
|
SELECT COUNT(*) INTO v_count FROM dba_users WHERE username = 'CONTAFIN_ORACLE';
|
|
IF v_count > 0 THEN
|
|
-- Kill all sessions first
|
|
roa_kill_user_sessions('CONTAFIN_ORACLE');
|
|
|
|
-- Drop the private synonym (if exists)
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP SYNONYM CONTAFIN_ORACLE.VDEF_PROGRAME_SERII';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped synonym CONTAFIN_ORACLE.VDEF_PROGRAME_SERII');
|
|
EXCEPTION WHEN OTHERS THEN NULL;
|
|
END;
|
|
|
|
-- Now drop the user
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
|
|
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully.');
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
-- Acelasi motiv ca la sectiunea 1: sesiune inca vie.
|
|
DBMS_OUTPUT.PUT_LINE(' WARN (incercarea 1): ' || SQLERRM);
|
|
roa_kill_user_sessions('CONTAFIN_ORACLE');
|
|
DBMS_SESSION.SLEEP(3);
|
|
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
|
|
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully (retry).');
|
|
END;
|
|
ELSE
|
|
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE does not exist.');
|
|
END IF;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
DBMS_OUTPUT.PUT_LINE(' ERROR dropping CONTAFIN_ORACLE: ' || SQLERRM);
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 3: DROP PUBLIC SYNONYMS
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [3/6] Dropping public synonyms...
|
|
PROMPT ============================================================
|
|
|
|
DECLARE
|
|
CURSOR c_synonyms IS
|
|
SELECT synonym_name
|
|
FROM dba_synonyms
|
|
WHERE owner = 'PUBLIC'
|
|
AND (table_owner = 'CONTAFIN_ORACLE'
|
|
OR synonym_name IN (
|
|
'STRINGAGG', 'CHAR_ROW', 'CHAR_TAB', 'NUM_ROW', 'NUM_TAB',
|
|
'UW_SEL_ROW', 'UW_SEL_TAB', 'GETWORDCOUNT', 'GETWORDNUM',
|
|
'CHARC2COLLECTION', 'CHARN2COLLECTION', 'VALOARETAG',
|
|
'SAL_CONTRACT_M', 'CONTRACT_M', 'SAL_RED', 'SAL_CAMPURI_RED',
|
|
'TABSTERS', 'SAL_TABELESTERS', 'PACK_UPDATE', 'PACK_UTILS',
|
|
'PACK_UTILS_FILE', 'PACK_ROARTVAI', 'RTVAI_AGENTI', 'RTVAI_ISTORIC',
|
|
'FF_SUME', 'FF_PERSINTRET', 'VANZARI_DETALII_TAB', 'PIVOT_TABLE',
|
|
'PIVOT_ROW', 'TABINCHIDERETVA', 'TABELAVALORITAGURI',
|
|
'RANDINCHIDERETVA', 'SERVER_INFO', 'EXECUTESCRIPTOS'
|
|
)
|
|
OR synonym_name LIKE 'SYN_%');
|
|
v_count NUMBER := 0;
|
|
BEGIN
|
|
FOR r IN c_synonyms LOOP
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || r.synonym_name;
|
|
v_count := v_count + 1;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN NULL;
|
|
END;
|
|
END LOOP;
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped ' || v_count || ' public synonyms.');
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 4: DROP APPLICATION CONTEXT
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [4/6] Dropping application context...
|
|
PROMPT ============================================================
|
|
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP CONTEXT SESIUNE';
|
|
DBMS_OUTPUT.PUT_LINE(' Context SESIUNE dropped.');
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
DBMS_OUTPUT.PUT_LINE(' Context SESIUNE not found or already dropped.');
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 5: DROP SYS CUSTOM OBJECTS
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [5/6] Dropping SYS custom objects...
|
|
PROMPT ============================================================
|
|
|
|
-- Drop view first (depends on package)
|
|
BEGIN EXECUTE IMMEDIATE 'DROP VIEW SYS.VAUTH_SERII';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.VAUTH_SERII');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- Drop scheduler job (SYS.INFO purge)
|
|
BEGIN DBMS_SCHEDULER.DROP_JOB(job_name => 'SYS.SYSINFO_PURJARE_ZILNIC', force => TRUE);
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.SYSINFO_PURJARE_ZILNIC');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- Drop procedures
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PROCEDURE SYS.UPDATESQLPLUS';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.UPDATESQLPLUS');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PROCEDURE SYS.NEWSCHEMAJOB';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.NEWSCHEMAJOB');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PROCEDURE SYS.NEWSCHEMA';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.NEWSCHEMA');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PROCEDURE SYS.EXECUTESCRIPTOS';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.EXECUTESCRIPTOS');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PROCEDURE SYS.PINFO';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.PINFO');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- Drop package
|
|
BEGIN EXECUTE IMMEDIATE 'DROP PACKAGE SYS.AUTH_PACK';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.AUTH_PACK');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- Drop sequence
|
|
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE SYS.SEQ_AUTH_SERII';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.SEQ_AUTH_SERII');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- Drop tables
|
|
BEGIN EXECUTE IMMEDIATE 'DROP TABLE SYS.AUTH_SERII PURGE';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.AUTH_SERII');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP TABLE SYS.AUTH_DETALII PURGE';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.AUTH_DETALII');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
BEGIN EXECUTE IMMEDIATE 'DROP TABLE SYS.INFO PURGE';
|
|
DBMS_OUTPUT.PUT_LINE(' Dropped SYS.INFO');
|
|
EXCEPTION WHEN OTHERS THEN NULL; END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- SECTION 6: DROP TABLESPACE ROA
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT [6/6] Dropping tablespace ROA...
|
|
PROMPT ============================================================
|
|
|
|
DECLARE
|
|
v_count NUMBER;
|
|
BEGIN
|
|
SELECT COUNT(*) INTO v_count FROM dba_tablespaces WHERE tablespace_name = 'ROA';
|
|
IF v_count > 0 THEN
|
|
-- Check for any remaining objects
|
|
SELECT COUNT(*) INTO v_count FROM dba_segments WHERE tablespace_name = 'ROA';
|
|
|
|
IF v_count > 0 THEN
|
|
DBMS_OUTPUT.PUT_LINE(' WARNING: Tablespace ROA still has ' || v_count || ' segments.');
|
|
DBMS_OUTPUT.PUT_LINE(' Dropping tablespace with INCLUDING CONTENTS...');
|
|
END IF;
|
|
|
|
EXECUTE IMMEDIATE 'DROP TABLESPACE ROA INCLUDING CONTENTS AND DATAFILES';
|
|
DBMS_OUTPUT.PUT_LINE(' Tablespace ROA dropped successfully.');
|
|
ELSE
|
|
DBMS_OUTPUT.PUT_LINE(' Tablespace ROA does not exist.');
|
|
END IF;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
DBMS_OUTPUT.PUT_LINE(' ERROR dropping tablespace: ' || SQLERRM);
|
|
END;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- CLEANUP: Drop helper procedure
|
|
-- ============================================================================
|
|
DROP PROCEDURE roa_kill_user_sessions;
|
|
|
|
-- ============================================================================
|
|
-- VERIFICATION
|
|
-- ============================================================================
|
|
PROMPT
|
|
PROMPT ============================================================
|
|
PROMPT VERIFICATION - Remaining ROA Objects (should be empty)
|
|
PROMPT ============================================================
|
|
PROMPT
|
|
|
|
PROMPT Users with default tablespace ROA:
|
|
SELECT username, default_tablespace FROM dba_users WHERE default_tablespace = 'ROA';
|
|
|
|
PROMPT
|
|
PROMPT CONTAFIN_ORACLE user:
|
|
SELECT username FROM dba_users WHERE username = 'CONTAFIN_ORACLE';
|
|
|
|
PROMPT
|
|
PROMPT SYS custom objects:
|
|
SELECT object_name, object_type, status
|
|
FROM dba_objects
|
|
WHERE owner = 'SYS'
|
|
AND object_name IN (
|
|
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
|
|
'EXECUTESCRIPTOS', 'NEWSCHEMA', 'NEWSCHEMAJOB', 'UPDATESQLPLUS',
|
|
'PINFO', 'INFO', 'SEQ_AUTH_SERII'
|
|
);
|
|
|
|
PROMPT
|
|
PROMPT Public synonyms pointing to CONTAFIN_ORACLE:
|
|
SELECT COUNT(*) AS remaining_synonyms
|
|
FROM dba_synonyms
|
|
WHERE owner = 'PUBLIC'
|
|
AND table_owner = 'CONTAFIN_ORACLE';
|
|
|
|
PROMPT
|
|
PROMPT Tablespace ROA:
|
|
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'ROA';
|
|
|
|
-- ============================================================================
|
|
-- VERDICT: verificare autoritara, cu cod de iesire
|
|
-- ============================================================================
|
|
-- Toate sectiunile de mai sus prind exceptiile in WHEN OTHERS si doar scriu in
|
|
-- DBMS_OUTPUT, ca sa nu opreasca dezinstalarea la primul obstacol. Consecinta:
|
|
-- scriptul se termina "cu succes" chiar daca un user a supravietuit, iar
|
|
-- instalarea urmatoare pica in lant cu ORA-31684 ... already exists.
|
|
-- Blocul asta numara ce a ramas si iese cu cod de eroare daca nu e curat.
|
|
-- Pas 1: raportarea (nu poate pica scriptul, deci output-ul ajunge pe ecran).
|
|
DECLARE
|
|
v_users NUMBER := 0;
|
|
v_contafin NUMBER := 0;
|
|
v_sysobj NUMBER := 0;
|
|
v_syn NUMBER := 0;
|
|
v_tbs NUMBER := 0;
|
|
v_total NUMBER := 0;
|
|
v_msg VARCHAR2(4000) := '';
|
|
BEGIN
|
|
SELECT COUNT(*) INTO v_users
|
|
FROM dba_users
|
|
WHERE default_tablespace = 'ROA'
|
|
AND username <> 'CONTAFIN_ORACLE';
|
|
|
|
SELECT COUNT(*) INTO v_contafin
|
|
FROM dba_users WHERE username = 'CONTAFIN_ORACLE';
|
|
|
|
SELECT COUNT(*) INTO v_sysobj
|
|
FROM dba_objects
|
|
WHERE owner = 'SYS'
|
|
AND object_name IN (
|
|
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
|
|
'EXECUTESCRIPTOS', 'NEWSCHEMA', 'NEWSCHEMAJOB', 'UPDATESQLPLUS',
|
|
'PINFO', 'INFO', 'SEQ_AUTH_SERII');
|
|
|
|
SELECT COUNT(*) INTO v_syn
|
|
FROM dba_synonyms
|
|
WHERE owner = 'PUBLIC' AND table_owner = 'CONTAFIN_ORACLE';
|
|
|
|
SELECT COUNT(*) INTO v_tbs
|
|
FROM dba_tablespaces WHERE tablespace_name = 'ROA';
|
|
|
|
IF v_users > 0 THEN v_msg := v_msg || v_users || ' user(i) de firma; '; END IF;
|
|
IF v_contafin > 0 THEN v_msg := v_msg || 'CONTAFIN_ORACLE; '; END IF;
|
|
IF v_sysobj > 0 THEN v_msg := v_msg || v_sysobj || ' obiecte SYS; '; END IF;
|
|
IF v_syn > 0 THEN v_msg := v_msg || v_syn || ' sinonime publice; '; END IF;
|
|
IF v_tbs > 0 THEN v_msg := v_msg || 'tablespace ROA; '; END IF;
|
|
|
|
v_total := v_users + v_contafin + v_sysobj + v_syn + v_tbs;
|
|
|
|
IF v_total = 0 THEN
|
|
DBMS_OUTPUT.PUT_LINE('============================================================');
|
|
DBMS_OUTPUT.PUT_LINE(' ROA UNINSTALL COMPLETE');
|
|
DBMS_OUTPUT.PUT_LINE('============================================================');
|
|
DBMS_OUTPUT.PUT_LINE('Baza este curata. Poti relua scripturile de instalare.');
|
|
ELSE
|
|
DBMS_OUTPUT.PUT_LINE('============================================================');
|
|
DBMS_OUTPUT.PUT_LINE(' ROA UNINSTALL INCOMPLET');
|
|
DBMS_OUTPUT.PUT_LINE('============================================================');
|
|
DBMS_OUTPUT.PUT_LINE('Au ramas: ' || RTRIM(v_msg, '; '));
|
|
DBMS_OUTPUT.PUT_LINE('Cauza uzuala: o sesiune activa tinea userul ocupat.');
|
|
DBMS_OUTPUT.PUT_LINE('Inchide aplicatia ROA / sesiunile sqlplus si ruleaza din nou.');
|
|
DBMS_OUTPUT.PUT_LINE('NU porni instalarea acum - pasul 05 va da ORA-31684 in lant.');
|
|
END IF;
|
|
END;
|
|
/
|
|
|
|
-- Pas 2: verdictul propriu-zis. Recalculeaza acelasi total si iese cu cod de
|
|
-- eroare daca nu e zero. Diagnosticul detaliat e deja tiparit mai sus.
|
|
WHENEVER SQLERROR EXIT FAILURE
|
|
|
|
DECLARE
|
|
v_total NUMBER;
|
|
BEGIN
|
|
SELECT (SELECT COUNT(*) FROM dba_users
|
|
WHERE default_tablespace = 'ROA' AND username <> 'CONTAFIN_ORACLE')
|
|
+ (SELECT COUNT(*) FROM dba_users WHERE username = 'CONTAFIN_ORACLE')
|
|
+ (SELECT COUNT(*) FROM dba_objects
|
|
WHERE owner = 'SYS'
|
|
AND object_name IN (
|
|
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
|
|
'EXECUTESCRIPTOS', 'NEWSCHEMA', 'NEWSCHEMAJOB', 'UPDATESQLPLUS',
|
|
'PINFO', 'INFO', 'SEQ_AUTH_SERII'))
|
|
+ (SELECT COUNT(*) FROM dba_synonyms
|
|
WHERE owner = 'PUBLIC' AND table_owner = 'CONTAFIN_ORACLE')
|
|
+ (SELECT COUNT(*) FROM dba_tablespaces WHERE tablespace_name = 'ROA')
|
|
INTO v_total
|
|
FROM dual;
|
|
|
|
IF v_total > 0 THEN
|
|
RAISE_APPLICATION_ERROR(-20900,
|
|
'ROA UNINSTALL INCOMPLET - au ramas ' || v_total ||
|
|
' obiect(e). Vezi raportul de mai sus.');
|
|
END IF;
|
|
END;
|
|
/
|
|
|
|
EXIT SUCCESS
|