feat(oracle): kit de instalare la client + corectarea lipsurilor din instalare
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
This commit is contained in:
@@ -12,10 +12,18 @@
|
||||
-- WARNING: This reduces security. For production environments, consider
|
||||
-- creating a custom profile with appropriate settings.
|
||||
--
|
||||
-- Usage:
|
||||
-- @configure-profile.sql
|
||||
-- ATENTIE - UNELTA DE REMEDIERE MANUALA, NU FACE PARTE DIN FLUXUL DE INSTALARE
|
||||
-- ----------------------------------------------------------------------------
|
||||
-- La o instalare normala NU rulezi scriptul asta: `01-setup-database.ps1` face
|
||||
-- deja acelasi lucru automat, la Step 4 (in PDB) si Step 4b (in CDB root).
|
||||
-- Foloseste-l doar cand `07-verify-installation.ps1` / `verify-objects.sql`
|
||||
-- semnaleaza ca profilul DEFAULT are din nou limite de parola - de exemplu pe o
|
||||
-- baza configurata inainte ca Step 4b sa existe, sau dupa un patch Oracle.
|
||||
--
|
||||
-- Connect as: SYSDBA
|
||||
-- Usage:
|
||||
-- sqlplus sys/<parola>@<host>:1521/XEPDB1 as sysdba @configure-profile.sql
|
||||
--
|
||||
-- Connect as: SYSDBA, pe PDB (XEPDB1), NU pe CDB root.
|
||||
-- ============================================================================
|
||||
|
||||
SET ECHO OFF
|
||||
@@ -97,3 +105,46 @@ WHERE username IN ('CONTAFIN_ORACLE', 'SYSTEM', 'SYS')
|
||||
OR username LIKE 'TEST%';
|
||||
|
||||
PROMPT
|
||||
|
||||
-- ============================================================================
|
||||
-- ULTIMUL PAS: ACELASI PROFIL SI IN CDB ROOT
|
||||
-- ============================================================================
|
||||
-- ALTER PROFILE dintr-un PDB nu acopera CDB root: acolo DEFAULT ramane cu
|
||||
-- PASSWORD_LIFE_TIME 180, deci SYSTEM din root expira la ~6 luni de la
|
||||
-- instalare (ORA-28002, apoi ORA-28001) chiar daca in PDB totul e UNLIMITED.
|
||||
--
|
||||
-- DEFAULT din root e un profil LOCAL, deci clauza CONTAINER=ALL NU e valida
|
||||
-- aici (ORA-65142). Se comuta containerul si se altereaza profilul de acolo.
|
||||
--
|
||||
-- Blocul e ULTIMUL din fisier intentionat: dupa ALTER SESSION SET CONTAINER
|
||||
-- restul scriptului ar rula in root, nu in PDB.
|
||||
-- Pe o baza non-CDB, ALTER SESSION esueaza inofensiv (WHENEVER SQLERROR
|
||||
-- CONTINUE) si ALTER PROFILE se aplica pe singurul container existent.
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT Applying the same profile in CDB root
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
|
||||
ALTER SESSION SET CONTAINER = CDB$ROOT;
|
||||
|
||||
ALTER PROFILE DEFAULT LIMIT
|
||||
PASSWORD_LIFE_TIME UNLIMITED
|
||||
PASSWORD_GRACE_TIME UNLIMITED
|
||||
PASSWORD_REUSE_TIME UNLIMITED
|
||||
PASSWORD_REUSE_MAX UNLIMITED
|
||||
FAILED_LOGIN_ATTEMPTS UNLIMITED
|
||||
PASSWORD_LOCK_TIME UNLIMITED;
|
||||
|
||||
PROMPT
|
||||
PROMPT Account status in CDB root:
|
||||
SELECT username, account_status, expiry_date
|
||||
FROM dba_users
|
||||
WHERE username IN ('SYS', 'SYSTEM');
|
||||
|
||||
PROMPT
|
||||
PROMPT NOTA: daca SYSTEM apare EXPIRED(GRACE), statusul NU se curata singur
|
||||
PROMPT cand profilul devine UNLIMITED - cere o singura data:
|
||||
PROMPT ALTER USER SYSTEM IDENTIFIED BY <parola>;
|
||||
PROMPT (sau ruleaza 01-setup-database.ps1 -ResetSystemPassword)
|
||||
PROMPT
|
||||
|
||||
@@ -24,7 +24,7 @@ PROMPT
|
||||
-- SECTION 1: GRANTS TO CONTAFIN_ORACLE
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [1/5] Granting privileges to CONTAFIN_ORACLE...
|
||||
PROMPT [1/6] Granting privileges to CONTAFIN_ORACLE...
|
||||
|
||||
-- Execute on SYS packages
|
||||
GRANT EXECUTE ON SYS.AUTH_PACK TO CONTAFIN_ORACLE;
|
||||
@@ -32,9 +32,16 @@ GRANT EXECUTE ON SYS.DBMS_SCHEDULER TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.DBMS_LOCK TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UTL_INADDR TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UTL_FILE TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UTL_MAIL TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UTL_SMTP TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UTL_TCP TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.DBMS_CRYPTO TO CONTAFIN_ORACLE;
|
||||
-- Proceduri SYS proprii ROA. Grant DIRECT, nu prin rol si nu prin sinonim public:
|
||||
-- CONTAFIN_ORACLE.PACK_UPDATE are drepturi de definitor si apeleaza calificat
|
||||
-- SYS.Updatesqlplus(...), deci rolurile si sinonimele nu se aplica. Fara ele
|
||||
-- PACK_UPDATE ramane INVALID (PLS-00201). Confirmat pe ROA_CENTRAL 2026-08-25.
|
||||
GRANT EXECUTE ON SYS.EXECUTESCRIPTOS TO CONTAFIN_ORACLE;
|
||||
GRANT EXECUTE ON SYS.UPDATESQLPLUS TO CONTAFIN_ORACLE;
|
||||
|
||||
-- Directory privileges
|
||||
GRANT CREATE ANY DIRECTORY TO CONTAFIN_ORACLE;
|
||||
@@ -51,7 +58,7 @@ PROMPT Grants to CONTAFIN_ORACLE complete.
|
||||
-- SECTION 2: PUBLIC GRANTS
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [2/5] Granting public privileges...
|
||||
PROMPT [2/6] Granting public privileges...
|
||||
|
||||
-- UTL packages for public use
|
||||
GRANT EXECUTE ON SYS.UTL_FILE TO PUBLIC;
|
||||
@@ -62,7 +69,7 @@ PROMPT Public grants complete.
|
||||
-- SECTION 3: SYS PUBLIC SYNONYMS
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [3/5] Creating SYS public synonyms...
|
||||
PROMPT [3/6] Creating SYS public synonyms...
|
||||
|
||||
-- Synonyms for SYS procedures
|
||||
BEGIN EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM SYN_NEWSCHEMA'; EXCEPTION WHEN OTHERS THEN NULL; END;
|
||||
@@ -91,7 +98,7 @@ PROMPT SYS public synonyms complete.
|
||||
-- SECTION 4: DIRECTORY DMPDIR
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [4/5] Creating DMPDIR directory...
|
||||
PROMPT [4/6] Creating DMPDIR directory...
|
||||
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY DMPDIR AS ''C:\DMPDIR''';
|
||||
@@ -126,7 +133,7 @@ GRANT READ, WRITE ON DIRECTORY DMPDIR TO PUBLIC;
|
||||
-- Vederile absente pe versiunea/editia curenta sunt ignorate (ORA-00942).
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [5/5] Granting data dictionary reads to CONTAFIN_ORACLE (PACK_DIAG_SPATIU)...
|
||||
PROMPT [5/6] Granting data dictionary reads to CONTAFIN_ORACLE (PACK_DIAG_SPATIU)...
|
||||
|
||||
DECLARE
|
||||
TYPE t_lista IS TABLE OF VARCHAR2(30);
|
||||
@@ -170,6 +177,40 @@ END;
|
||||
|
||||
PROMPT Dictionary grants complete.
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- SECTION 6: RECOMPILARE CONTAFIN_ORACLE
|
||||
-- ============================================================================
|
||||
-- Obiectele venite cu Data Pump raman INVALID: la momentul importului granturile
|
||||
-- de mai sus inca nu erau puse, de unde ORA-39082 "created with compilation
|
||||
-- warnings" pe SENDEMAIL, EMAIL*, PACK_UPDATE, PACK_UTILS. Oracle le-ar recompila
|
||||
-- abia la primul apel, asa ca fara pasul asta 07-verify-installation raporteaza
|
||||
-- obiecte invalide la fiecare instalare curata.
|
||||
-- Verificat pe VM 302 (2026-08-25): 2 invalide inainte, 0 dupa.
|
||||
-- ============================================================================
|
||||
PROMPT
|
||||
PROMPT [6/6] Recompiling CONTAFIN_ORACLE...
|
||||
|
||||
BEGIN
|
||||
SYS.UTL_RECOMP.RECOMP_SERIAL('CONTAFIN_ORACLE');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' Recompilare: ' || SQLERRM);
|
||||
END;
|
||||
/
|
||||
|
||||
DECLARE
|
||||
lnInvalid PLS_INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO lnInvalid
|
||||
FROM dba_objects
|
||||
WHERE owner = 'CONTAFIN_ORACLE' AND status = 'INVALID';
|
||||
DBMS_OUTPUT.PUT_LINE(' Obiecte INVALID ramase in CONTAFIN_ORACLE: ' || lnInvalid);
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT Recompile complete.
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================
|
||||
PROMPT SYS Grants and Synonyms Installation Complete
|
||||
|
||||
@@ -32,7 +32,7 @@ PROMPT
|
||||
-- SECTION 1: TABLES
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [1/11] Creating SYS.AUTH_DETALII table...
|
||||
PROMPT [1/10] Creating SYS.AUTH_DETALII table...
|
||||
DECLARE
|
||||
v_count NUMBER;
|
||||
BEGIN
|
||||
@@ -50,7 +50,7 @@ BEGIN
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT [2/11] Creating SYS.AUTH_SERII table...
|
||||
PROMPT [2/10] Creating SYS.AUTH_SERII table...
|
||||
DECLARE
|
||||
v_count NUMBER;
|
||||
BEGIN
|
||||
@@ -76,7 +76,7 @@ BEGIN
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT [3/11] Creating SYS.INFO table (logging)...
|
||||
PROMPT [3/10] Creating SYS.INFO table (logging)...
|
||||
-- IMPORTANT: SYS.INFO e log de aplicatie, nu obiect de dictionar - SYS.pINFO scrie ~7 randuri la
|
||||
-- fiecare conectare (~13.500 randuri / ~2 MB pe luna) si nimic nu o citeste. Tinuta in SYSTEM,
|
||||
-- umple tablespace-ul dictionarului si **orice** script de actualizare pica apoi cu
|
||||
@@ -116,7 +116,7 @@ END;
|
||||
-- SECTION 2: SEQUENCE
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [4/11] Creating SYS.SEQ_AUTH_SERII sequence...
|
||||
PROMPT [4/10] Creating SYS.SEQ_AUTH_SERII sequence...
|
||||
DECLARE
|
||||
v_count NUMBER;
|
||||
BEGIN
|
||||
@@ -143,7 +143,7 @@ END;
|
||||
-- SECTION 3: LOGGING PROCEDURE (pINFO)
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [5/11] Creating SYS.pINFO procedure (logging)...
|
||||
PROMPT [5/10] Creating SYS.pINFO procedure (logging)...
|
||||
CREATE OR REPLACE PROCEDURE SYS.pINFO(
|
||||
p_info IN CLOB,
|
||||
p_locatia IN VARCHAR2 DEFAULT NULL
|
||||
@@ -164,7 +164,7 @@ END pINFO;
|
||||
-- SECTION 4: AUTH_PACK PACKAGE (Oracle 21c compatible with DBMS_CRYPTO)
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [6/11] Creating SYS.AUTH_PACK package specification...
|
||||
PROMPT [6/10] Creating SYS.AUTH_PACK package specification...
|
||||
CREATE OR REPLACE PACKAGE SYS.AUTH_PACK IS
|
||||
-- ========================================================================
|
||||
-- AUTH_PACK - License and Authentication Management
|
||||
@@ -229,7 +229,7 @@ CREATE OR REPLACE PACKAGE SYS.AUTH_PACK IS
|
||||
END AUTH_PACK;
|
||||
/
|
||||
|
||||
PROMPT [7/11] Creating SYS.AUTH_PACK package body...
|
||||
PROMPT [7/10] Creating SYS.AUTH_PACK package body...
|
||||
CREATE OR REPLACE PACKAGE BODY SYS.AUTH_PACK IS
|
||||
-- ========================================================================
|
||||
-- MODIFICATION HISTORY:
|
||||
@@ -769,7 +769,7 @@ END AUTH_PACK;
|
||||
-- SECTION 5: VIEW
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [8/11] Creating SYS.VAUTH_SERII view...
|
||||
PROMPT [8/10] Creating SYS.VAUTH_SERII view...
|
||||
CREATE OR REPLACE VIEW SYS.VAUTH_SERII (
|
||||
ID_PROGRAM,
|
||||
NUME,
|
||||
@@ -791,142 +791,355 @@ WHERE b.sters = 0
|
||||
-- SECTION 6: ADDITIONAL PROCEDURES
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT [9/11] Creating SYS.EXECUTESCRIPTOS procedure...
|
||||
CREATE OR REPLACE PROCEDURE SYS.EXECUTESCRIPTOS(
|
||||
p_nume_script IN VARCHAR2,
|
||||
p_param IN VARCHAR2,
|
||||
p_wait IN VARCHAR2,
|
||||
p_result OUT NUMBER
|
||||
) IS
|
||||
v_job_name VARCHAR2(100);
|
||||
v_state VARCHAR2(30);
|
||||
BEGIN
|
||||
v_job_name := 'EXECUTESCRIPTOS_' || TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS');
|
||||
PROMPT [9/10] Creating SYS.EXECUTESCRIPTOS, NEWSCHEMA, NEWSCHEMAJOB, UPDATESQLPLUS...
|
||||
-- ============================================================================
|
||||
-- Sursa: procedurile SYS de pe ROA_CENTRAL (10.0.20.121:1521/ROA), extrase din
|
||||
-- dba_source la 2026-08-25. Versiunile anterioare din acest fisier aveau
|
||||
-- semnaturi inventate, incompatibile cu CONTAFIN_ORACLE.PACK_UPDATE, care apeleaza
|
||||
-- SYS.Updatesqlplus(tcSqlPlusPath, tcScriptPath). Nu modifica semnaturile fara sa
|
||||
-- verifici intai apelurile din PACK_UPDATE / PACK_UTILS.
|
||||
-- ============================================================================
|
||||
|
||||
CREATE OR REPLACE PROCEDURE SYS.ExecuteScriptOS(tcPowerShellPath in varchar2,
|
||||
tcScriptPath in varchar2) as
|
||||
lcJobName varchar2(500);
|
||||
begin
|
||||
lcJobName := 'exec_ps_' || SUBSTR(SYS_GUID(), 1, 8);
|
||||
|
||||
DBMS_SCHEDULER.CREATE_JOB(
|
||||
job_name => v_job_name,
|
||||
job_type => 'EXECUTABLE',
|
||||
job_action => p_nume_script,
|
||||
number_of_arguments => 1,
|
||||
start_date => SYSTIMESTAMP,
|
||||
enabled => FALSE,
|
||||
auto_drop => TRUE
|
||||
job_name => lcJobName,
|
||||
job_action => tcPowerShellPath,
|
||||
number_of_arguments => 4,
|
||||
job_type => 'executable',
|
||||
enabled => FALSE
|
||||
);
|
||||
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
|
||||
job_name => v_job_name,
|
||||
argument_position => 1,
|
||||
argument_value => p_param
|
||||
);
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 1, '-ExecutionPolicy');
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 2, 'Bypass');
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 3, '-File');
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 4, tcScriptPath);
|
||||
|
||||
DBMS_SCHEDULER.ENABLE(v_job_name);
|
||||
DBMS_SCHEDULER.ENABLE(lcJobName);
|
||||
end ExecuteScriptOS;
|
||||
/
|
||||
|
||||
IF p_wait = 'Y' THEN
|
||||
LOOP
|
||||
BEGIN
|
||||
SELECT state INTO v_state
|
||||
FROM dba_scheduler_jobs
|
||||
WHERE job_name = v_job_name;
|
||||
CREATE OR REPLACE PROCEDURE SYS.NewSchema(tcSchema varchar2,
|
||||
tnLuna number,
|
||||
tnAn number) is
|
||||
lcCommand varchar2(1000);
|
||||
|
||||
EXIT WHEN v_state NOT IN ('SCHEDULED', 'RUNNING');
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
EXIT; -- Job completed and was auto-dropped
|
||||
END;
|
||||
DBMS_LOCK.SLEEP(1);
|
||||
END LOOP;
|
||||
END IF;
|
||||
lcSchemaSursa VARCHAR2(100) := 'FIRMANOUA';
|
||||
lcSchemaDestinatie VARCHAR2(100) := tcSchema;
|
||||
lcDumpFile VARCHAR2(100);
|
||||
lcDumpDir VARCHAR2(100) := 'DMPDIR';
|
||||
-- lnCount number(10);
|
||||
|
||||
p_result := 0;
|
||||
EXCEPTION
|
||||
lcSql varchar2(1000);
|
||||
lnAn number := tnAn;
|
||||
lnLuna number := tnLuna;
|
||||
ldDataI date;
|
||||
ldDataF date;
|
||||
lnZileLucratoare number(10) := 0;
|
||||
lnOreLucratoare number(10) := 0;
|
||||
lnMaxAn number(10);
|
||||
lcLocatie varchar2(100) := 'CREARE FIRMA ' || tcSchema;
|
||||
|
||||
h1 NUMBER; -- Data Pump job handle
|
||||
ind NUMBER; -- Loop index
|
||||
percent_done NUMBER; -- Percentage of job complete
|
||||
job_state VARCHAR2(30); -- To keep track of job state
|
||||
le ku$_LogEntry; -- For WIP and error messages
|
||||
js ku$_JobStatus; -- The job status from get_status
|
||||
-- jd ku$_JobDesc; -- The job description from get_status
|
||||
sts ku$_Status; -- The status object returned by get_status
|
||||
begin
|
||||
------------------------------------------------------------------------
|
||||
-- CREATE THE USER
|
||||
------------------------------------------------------------------------
|
||||
/* SELECT COUNT(1)
|
||||
INTO lnCount
|
||||
FROM dba_users
|
||||
WHERE username = UPPER(tcSchema);
|
||||
|
||||
IF lnCount <> 0 THEN
|
||||
EXECUTE IMMEDIATE ('DROP USER ' || tcSchema || ' CASCADE');
|
||||
END IF;*/
|
||||
|
||||
lcCommand := 'create user ' || tcSchema || ' identified by ' || CASE
|
||||
WHEN upper(tcSchema) like 'TEST%' THEN
|
||||
'"123"'
|
||||
ELSE
|
||||
'ROMFASTSOFT'
|
||||
END || ' default tablespace ROA
|
||||
temporary tablespace TEMP
|
||||
profile DEFAULT';
|
||||
pinfo(lcCommand, lcLocatie);
|
||||
execute immediate lcCommand;
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- GRANT PRIVILEGIES
|
||||
------------------------------------------------------------------------
|
||||
lcCommand := 'grant connect to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant resource to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create materialized view to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create procedure to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create sequence to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create table to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create trigger to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create type to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant create view to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant debug connect session to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant select any table to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
lcCommand := 'grant unlimited tablespace to ' || tcSchema;
|
||||
execute immediate lcCommand;
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- IMPORT DUMP
|
||||
------------------------------------------------------------------------
|
||||
-- Create a (user-named) Data Pump job to do a "full" import (everything
|
||||
-- in the dump file without filtering).
|
||||
|
||||
lcDumpFile := lcSchemaSursa || '.dmp';
|
||||
|
||||
-- h1 := DBMS_DATAPUMP.OPEN('IMPORT', 'SCHEMA', NULL, lcSchemaDestinatie);
|
||||
h1 := DBMS_DATAPUMP.OPEN('IMPORT', 'SCHEMA', NULL, lcSchemaDestinatie);
|
||||
|
||||
-- Specify the single dump file for the job (using the handle just returned)
|
||||
-- and directory object, which must already be defined and accessible
|
||||
-- to the user running this procedure. This is the dump file created by
|
||||
-- the export operation in the first example.
|
||||
|
||||
-- DBMS_DATAPUMP.ADD_FILE(h1, lcDumpFile, lcDumpDir);
|
||||
|
||||
BEGIN
|
||||
PINFO('DBMS_DATAPUMP.ADD_FILE LOG', lcLocatie);
|
||||
DBMS_DATAPUMP.ADD_FILE(handle => h1,
|
||||
filename => lcSchemaDestinatie || '.log',
|
||||
directory => 'DMPDIR',
|
||||
filetype => 3);
|
||||
|
||||
PINFO('DBMS_DATAPUMP.ADD_FILE DMP', lcLocatie);
|
||||
DBMS_DATAPUMP.ADD_FILE(handle => h1,
|
||||
filename => lcDumpFile,
|
||||
directory => lcDumpDir,
|
||||
filetype => 1);
|
||||
|
||||
-- A metadata remap will map all schema objects from HR to BLAKE.
|
||||
PINFO('DBMS_DATAPUMP.METADATA_REMAP', lcLocatie);
|
||||
DBMS_DATAPUMP.METADATA_REMAP(h1,
|
||||
'REMAP_SCHEMA',
|
||||
lcSchemaSursa,
|
||||
lcSchemaDestinatie);
|
||||
|
||||
-- If a table already exists in the destination schema, skip it (leave
|
||||
-- the preexisting table alone). This is the default, but it does not hurt
|
||||
-- to specify it explicitly.
|
||||
|
||||
DBMS_DATAPUMP.SET_PARAMETER(h1, 'TABLE_EXISTS_ACTION', 'SKIP');
|
||||
|
||||
-- Start the job. An exception is returned if something is not set up properly.
|
||||
|
||||
PINFO('DBMS_DATAPUMP.START_JOB', lcLocatie);
|
||||
DBMS_DATAPUMP.START_JOB(h1);
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- The import job should now be running. In the following loop, the job is
|
||||
-- monitored until it completes. In the meantime, progress information is
|
||||
-- displayed. Note: this is identical to the export example.
|
||||
|
||||
percent_done := 0;
|
||||
job_state := 'UNDEFINED';
|
||||
while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
|
||||
dbms_datapump.get_status(h1,
|
||||
dbms_datapump.ku$_status_job_error +
|
||||
dbms_datapump.ku$_status_job_status +
|
||||
dbms_datapump.ku$_status_wip,
|
||||
-1,
|
||||
job_state,
|
||||
sts);
|
||||
js := sts.job_status;
|
||||
|
||||
-- If the percentage done changed, display the new value.
|
||||
|
||||
if js.percent_done != percent_done then
|
||||
pinfo('*** Job percent done = ' || to_char(js.percent_done),
|
||||
lcLocatie);
|
||||
percent_done := js.percent_done;
|
||||
end if;
|
||||
|
||||
-- If any work-in-progress (WIP) or Error messages were received for the job,
|
||||
-- display them.
|
||||
|
||||
if (bitand(sts.mask, dbms_datapump.ku$_status_wip) != 0) then
|
||||
le := sts.wip;
|
||||
else
|
||||
if (bitand(sts.mask, dbms_datapump.ku$_status_job_error) != 0) then
|
||||
le := sts.error;
|
||||
else
|
||||
le := null;
|
||||
end if;
|
||||
end if;
|
||||
if le is not null then
|
||||
ind := le.FIRST;
|
||||
while ind is not null loop
|
||||
-- dbms_output.put_line(le(ind).LogText);
|
||||
pinfo(le(ind).LogText, lcLocatie);
|
||||
ind := le.NEXT(ind);
|
||||
end loop;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
-- Indicate that the job finished and gracefully detach from it.
|
||||
-- dbms_output.put_line('Job has completed');
|
||||
pinfo('Job has completed', lcLocatie);
|
||||
|
||||
-- dbms_output.put_line('Final job state = ' || job_state);
|
||||
pinfo('Final job state = ' || job_state,
|
||||
'CREARE FIRMA ' || lcSchemaDestinatie);
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- POST IMPORT
|
||||
|
||||
-- 1. actualizare calendar, sal_calendar, cote_tva
|
||||
-- CALENDAR
|
||||
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
||||
'.CALENDAR SET ANUL = :1, LUNA = :2, AN = TO_CHAR(:3), NL = LPAD(:4, 2, ''0'')';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
USING lnAn, lnLuna, lnAn, lnLuna;
|
||||
|
||||
-- SAL_CALENDAR
|
||||
ldDataI := TO_DATE(lpad(lnAn, 4, '0') || lpad(lnLuna, 2, '0'), 'YYYYMM');
|
||||
ldDataF := ADD_MONTHS(ldDataI, 1) - 1;
|
||||
lcSql := 'select ' || lcSchemaDestinatie ||
|
||||
'.pack_personal.calculeaza_nr_zile(:1, :2) FROM DUAL';
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
INTO lnZileLucratoare
|
||||
USING ldDataI, ldDataF;
|
||||
lnOreLucratoare := lnZileLucratoare * 8;
|
||||
|
||||
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
||||
'.SAL_CALENDAR SET AN = :1 , LUNA = :2, ZILELUC = :3, ORESTAS = :4, ORELUC = :5';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
USING lnAn, lnLuna, lnZileLucratoare, lnOreLucratoare, lnOreLucratoare;
|
||||
|
||||
-- SAL_IMPOZITAR
|
||||
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
||||
'.SAL_IMPOZITAR SET AN = :1 , LUNA = :2';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
USING lnAn, lnLuna;
|
||||
|
||||
-- PLCONT
|
||||
lcSql := 'SELECT max(an) as plan from ' || lcSchemaDestinatie ||
|
||||
'.PLCONT';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
into lnMaxAn;
|
||||
if lnMaxAn <> lnAn then
|
||||
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
||||
'.PLCONT SET AN = :1 WHERE AN = :2';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
USING lnAn, lnMaxAn;
|
||||
end if;
|
||||
|
||||
-- COTE_TVA
|
||||
lcSql := 'SELECT max(an*12+luna) from ' || lcSchemaDestinatie ||
|
||||
'.cote_tva';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
into lnMaxAn;
|
||||
|
||||
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
||||
'.COTE_TVA SET AN = :1, LUNA = :2 WHERE AN*12+LUNA = :3';
|
||||
PINFO(lcSql, lcLocatie);
|
||||
EXECUTE IMMEDIATE lcSql
|
||||
USING lnAn, lnLuna, lnMaxAn;
|
||||
------------------------------------------------------------------------
|
||||
-- 2. ACTUALIZARE SCHEMA LA ZI
|
||||
PINFO('Actualizare schema la zi...', lcLocatie);
|
||||
CONTAFIN_ORACLE.PACK_UPDATE.UpdateROA(tnUpdateApp => 0,
|
||||
tnUpdateScripturi => 0,
|
||||
tnUpdateDatabase => 1,
|
||||
tcSchemaList => tcSchema);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
p_result := -1;
|
||||
END EXECUTESCRIPTOS;
|
||||
PINFO(SQLERRM, lcLocatie);
|
||||
raise_application_error(-20000, SQLERRM);
|
||||
END;
|
||||
|
||||
DBMS_DATAPUMP.DETACH(h1);
|
||||
|
||||
end NewSchema;
|
||||
/
|
||||
|
||||
PROMPT [10/11] Creating SYS.NEWSCHEMA procedure...
|
||||
CREATE OR REPLACE PROCEDURE SYS.NEWSCHEMA(
|
||||
p_schema_name IN VARCHAR2,
|
||||
p_password IN VARCHAR2,
|
||||
p_result OUT NUMBER
|
||||
) IS
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'CREATE USER ' || p_schema_name ||
|
||||
' IDENTIFIED BY ' || p_password ||
|
||||
' DEFAULT TABLESPACE ROA' ||
|
||||
' TEMPORARY TABLESPACE TEMP' ||
|
||||
' QUOTA UNLIMITED ON ROA';
|
||||
|
||||
EXECUTE IMMEDIATE 'GRANT CONNECT, RESOURCE TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE TABLE TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE VIEW TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE SEQUENCE TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE PROCEDURE TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE TRIGGER TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE TYPE TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE SYNONYM TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE DATABASE LINK TO ' || p_schema_name;
|
||||
EXECUTE IMMEDIATE 'GRANT CREATE JOB TO ' || p_schema_name;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Schema ' || p_schema_name || ' created successfully!');
|
||||
|
||||
p_result := 0;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Error creating schema: ' || SQLERRM);
|
||||
p_result := -1;
|
||||
END NEWSCHEMA;
|
||||
CREATE OR REPLACE PROCEDURE SYS.NEWSCHEMAJOB(tcSchema varchar2,
|
||||
tnLuna number,
|
||||
tnAn number) as
|
||||
lcJobName varchar2(500);
|
||||
begin
|
||||
lcJobName := 'NEWSCHEMA_' || UPPER(tcSchema);
|
||||
dbms_scheduler.create_job(job_name => lcJobName,
|
||||
job_type => 'STORED_PROCEDURE',
|
||||
job_action => 'NEWSCHEMA',
|
||||
number_of_arguments => 3,
|
||||
enabled => false);
|
||||
dbms_scheduler.set_job_argument_value(lcJobName, 1, tcSchema);
|
||||
dbms_scheduler.set_job_argument_value(lcJobName, 2, to_char(tnLuna));
|
||||
dbms_scheduler.set_job_argument_value(lcJobName, 3, to_char(tnAn));
|
||||
dbms_scheduler.enable(lcJobName);
|
||||
end NEWSCHEMAJOB;
|
||||
/
|
||||
|
||||
PROMPT [11/11] Creating SYS.NEWSCHEMAJOB and SYS.UPDATESQLPLUS procedures...
|
||||
CREATE OR REPLACE PROCEDURE SYS.NEWSCHEMAJOB(
|
||||
p_schema_name IN VARCHAR2,
|
||||
p_password IN VARCHAR2
|
||||
) IS
|
||||
v_job_name VARCHAR2(100);
|
||||
BEGIN
|
||||
v_job_name := 'NEWSCHEMA_' || p_schema_name;
|
||||
|
||||
DBMS_SCHEDULER.CREATE_JOB(
|
||||
job_name => v_job_name,
|
||||
job_type => 'STORED_PROCEDURE',
|
||||
job_action => 'SYS.NEWSCHEMA',
|
||||
number_of_arguments => 3,
|
||||
start_date => SYSTIMESTAMP,
|
||||
enabled => FALSE,
|
||||
auto_drop => TRUE
|
||||
);
|
||||
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
|
||||
job_name => v_job_name,
|
||||
argument_position => 1,
|
||||
argument_value => p_schema_name
|
||||
);
|
||||
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
|
||||
job_name => v_job_name,
|
||||
argument_position => 2,
|
||||
argument_value => p_password
|
||||
);
|
||||
|
||||
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
|
||||
job_name => v_job_name,
|
||||
argument_position => 3,
|
||||
argument_value => '0'
|
||||
);
|
||||
|
||||
DBMS_SCHEDULER.ENABLE(v_job_name);
|
||||
END NEWSCHEMAJOB;
|
||||
CREATE OR REPLACE PROCEDURE SYS.UpdateSQLPLUS(tcSqlPlusPath in varchar2,
|
||||
tcScriptPath in varchar2) as
|
||||
lcJobName varchar2(500);
|
||||
begin
|
||||
lcJobName := 'updateschema_' || to_char(sysdate, 'YYYYMMDDHH24MISS');
|
||||
dbms_scheduler.create_job(lcJobName,
|
||||
job_action => tcSqlPlusPath,
|
||||
number_of_arguments => 2,
|
||||
job_type => 'executable',
|
||||
enabled => false);
|
||||
dbms_scheduler.set_job_argument_value(lcJobName, 1, '/nolog');
|
||||
dbms_scheduler.set_job_argument_value(lcJobName, 2, '@' || tcScriptPath);
|
||||
dbms_scheduler.enable(lcJobName);
|
||||
end;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE PROCEDURE SYS.UPDATESQLPLUS IS
|
||||
v_result NUMBER;
|
||||
BEGIN
|
||||
-- Path may need to be adjusted for your Windows installation
|
||||
EXECUTESCRIPTOS('D:\ROMFAST\UPDATE\UPDATE_SQLPLUS.BAT', '', 'N', v_result);
|
||||
END UPDATESQLPLUS;
|
||||
/
|
||||
|
||||
-- ============================================================================
|
||||
-- SECTION 7: UTL_MAIL
|
||||
-- ============================================================================
|
||||
-- UTL_MAIL nu se instaleaza implicit in Oracle 21c. Fara el raman INVALID:
|
||||
-- CONTAFIN_ORACLE.SENDEMAIL, EMAILINCASARI, EMAILNOTIFICAREFACTURI,
|
||||
-- EMAILSTOCCRITIC, PACK_UPDATE si PACK_UTILS (PLS-00201: UTL_MAIL.SEND).
|
||||
-- Un GRANT nu ajuta - pachetul trebuie creat. Pe ROA_CENTRAL (productie)
|
||||
-- UTL_MAIL este VALID; verificat 2026-08-25.
|
||||
--
|
||||
-- Grantul catre CONTAFIN_ORACLE se face in sql\sys-grants.sql, dupa import.
|
||||
-- Pentru trimiterea efectiva de mailuri mai trebuie setat SMTP_OUT_SERVER.
|
||||
-- ============================================================================
|
||||
|
||||
PROMPT
|
||||
PROMPT [10/10] Installing UTL_MAIL...
|
||||
@?/rdbms/admin/utlmail.sql
|
||||
@?/rdbms/admin/prvtmail.plb
|
||||
PROMPT UTL_MAIL installed.
|
||||
|
||||
-- ============================================================================
|
||||
-- VERIFICATION
|
||||
|
||||
@@ -94,7 +94,8 @@ DECLARE
|
||||
)
|
||||
)
|
||||
ORDER BY username;
|
||||
v_count NUMBER := 0;
|
||||
v_count NUMBER := 0;
|
||||
v_failed NUMBER := 0;
|
||||
BEGIN
|
||||
FOR r IN c_users LOOP
|
||||
BEGIN
|
||||
@@ -107,10 +108,30 @@ BEGIN
|
||||
v_count := v_count + 1;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR: ' || SQLERRM);
|
||||
-- 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;
|
||||
/
|
||||
|
||||
@@ -137,8 +158,18 @@ BEGIN
|
||||
END;
|
||||
|
||||
-- Now drop the user
|
||||
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
|
||||
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully.');
|
||||
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;
|
||||
@@ -170,7 +201,7 @@ DECLARE
|
||||
'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'
|
||||
'RANDINCHIDERETVA', 'SERVER_INFO', 'EXECUTESCRIPTOS'
|
||||
)
|
||||
OR synonym_name LIKE 'SYN_%');
|
||||
v_count NUMBER := 0;
|
||||
@@ -344,10 +375,100 @@ PROMPT
|
||||
PROMPT Tablespace ROA:
|
||||
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'ROA';
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================
|
||||
PROMPT ROA UNINSTALL COMPLETE
|
||||
PROMPT ============================================================
|
||||
PROMPT
|
||||
PROMPT Database is now clean. You can re-run the setup scripts.
|
||||
PROMPT
|
||||
-- ============================================================================
|
||||
-- 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
|
||||
|
||||
Reference in New Issue
Block a user