This commit is contained in:
Grzegorz Michalski
2026-02-02 11:13:24 +01:00
parent ecd833f682
commit ffcb288afa
62 changed files with 8463 additions and 2845 deletions

View File

@@ -84,7 +84,7 @@ c:\_git\_local_rep\
│ ├── MARS_Packages\
│ │ └── REL01\
│ │ └── MARS-1057\ # New package folder
│ │ ├── rollback_version\
│ │ ├── current_version\
│ │ ├── new_version\
│ │ └── *.sql files
│ ├── database\
@@ -169,6 +169,157 @@ The deployment system uses these key components:
---
## Universal Tracking and Verification Scripts
### MANDATORY: Use Standard Template Files
**CRITICAL:** Every MARS package MUST include two universal scripts for tracking and verification. These scripts are reusable across all MARS issues and provide consistent version management.
#### Required Files Structure
```
MARS_Packages/
└── REL0X/
└── MARS-XXXX/
├── 01_MARS_XXXX_install_*.sql
├── 02_MARS_XXXX_install_*.sql
├── track_package_versions.sql # ✅ MANDATORY - Universal tracking
├── verify_packages_version.sql # ✅ MANDATORY - Universal verification
├── install_marsXXXX.sql # Master script
└── rollback_marsXXXX.sql
```
### track_package_versions.sql
**Purpose:** Universal script for tracking multiple package versions with editable package list.
**Key Features:**
-**Reusable** - Same file for all MARS issues
-**Configurable** - Edit package list array to specify which packages to track
-**Automatic** - Calls ENV_MANAGER.TRACK_PACKAGE_VERSION for each package
-**Summary Output** - Shows tracked packages count and versions
**Template:**
```sql
-- ===================================================================
-- PACKAGE LIST - Edit this array to specify packages to track
-- ===================================================================
vPackageList t_string_array := t_string_array(
'CT_MRDS.DATA_EXPORTER',
'CT_MRDS.FILE_MANAGER',
'ODS.FILE_MANAGER_ODS'
);
-- ===================================================================
```
**Usage in Install Script:**
```sql
PROMPT Step 4: Track Package Versions
PROMPT =========================================================================
@@track_package_versions.sql
```
**Benefits over custom tracking scripts:**
- No hardcoded package names in multiple places
- Single point of configuration
- Consistent error handling
- Standardized output format
- Copy-paste ready for new MARS issues
### verify_packages_version.sql
**Purpose:** Universal script for verifying ALL tracked packages for code changes.
**Key Features:**
-**Automatic Discovery** - Queries A_PACKAGE_VERSION_TRACKING to find all tracked packages
-**Hash Validation** - Calls CHECK_PACKAGE_CHANGES for each package
-**Status Report** - Shows OK or WARNING for each package
-**Zero Configuration** - No editing needed, works automatically
**Usage in Install Script:**
```sql
PROMPT Final Step: Verify All Package Versions
PROMPT =========================================================================
@@verify_packages_version.sql
```
**Output Example:**
```
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
--------------- ------------------- ---------- -------------------------------
CT_MRDS DATA_EXPORTER 2.2.0 OK: Package has not changed
CT_MRDS FILE_MANAGER 3.3.0 OK: Package has not changed
ODS FILE_MANAGER_ODS 2.1.0 OK: Package has not changed
```
### Master Install Script Structure (MANDATORY)
Every `install_marsXXXX.sql` MUST follow this exact structure:
```sql
-- ===================================================================
-- MARS-XXXX INSTALL SCRIPT
-- ===================================================================
-- Dynamic spool file generation
host mkdir log 2>nul
-- ... spool setup ...
PROMPT Step 1: Deploy Package Specification
@@01_MARS_XXXX_install_PACKAGE_SPEC.sql
PROMPT Step 2: Deploy Package Body
@@02_MARS_XXXX_install_PACKAGE_BODY.sql
PROMPT Step 3: Track Package Versions
@@track_package_versions.sql -- ✅ MANDATORY universal script
PROMPT Step 4: Verify Package Versions
@@verify_packages_version.sql -- ✅ MANDATORY universal script
spool off
quit;
```
### DO NOT Create Custom Track/Verify Scripts
**❌ WRONG (Custom tracking per MARS issue):**
```sql
@@04_MARS_XXXX_track_version.sql -- DON'T DO THIS
@@05_MARS_XXXX_verify_installation.sql -- DON'T DO THIS
```
**✅ CORRECT (Universal scripts):**
```sql
@@track_package_versions.sql -- Always use this
@@verify_packages_version.sql -- Always use this
```
**Why universal scripts are mandatory:**
- **Consistency** - Same behavior across all MARS packages
- **Maintainability** - Bug fixes propagate to all packages
- **Simplicity** - No need to create custom scripts for each issue
- **Compliance** - Ensures all packages follow same standard
- **Code Review** - Easier to review when structure is identical
### Copying Template Files
**For each new MARS package, copy from reference implementation:**
```powershell
# Copy universal scripts from MARS-826-PREHOOK (reference implementation)
Copy-Item "MARS_Packages\REL01_POST_DEACTIVATION\MARS-826-PREHOOK\track_package_versions.sql" `
"MARS_Packages\RELXX\MARS-YYYY\track_package_versions.sql"
Copy-Item "MARS_Packages\REL01_POST_DEACTIVATION\MARS-826-PREHOOK\verify_packages_version.sql" `
"MARS_Packages\RELXX\MARS-YYYY\verify_packages_version.sql"
# Edit package list in track_package_versions.sql
# No changes needed to verify_packages_version.sql (works automatically)
```
---
## Standard Deployment Workflow
### Step 1: Check Current Package Status
@@ -592,8 +743,6 @@ WHERE OWNER = 'CT_MRDS' -- Replace with target schema
MARS packages (e.g., MARS-1049, MARS-1011) are deployment packages that bundle database changes for specific features or fixes. They follow a standardized structure with logging, version tracking, and rollback capabilities.
**PREREQUISITE:** Before creating any MARS package, ensure you have completed **[Step 0: Prepare Dedicated Working Directory and Git Branch](#step-0-prepare-dedicated-working-directory-and-git-branch)**. Each MARS issue MUST have its own isolated working directory and feature branch.
**CRITICAL:** All MARS package installations MUST be executed as **ADMIN user** to ensure proper schema creation, privilege management, and cross-schema operations.
**Installation User Requirements:**
@@ -632,7 +781,7 @@ mock_data/
- track_package_versions.sql and verify_packages_version.sql
- README.md
- .gitignore (with standardized exclusions)
- rollback_version/ and new_version/ folders (if package modifications)
- current_version/ and new_version/ folders (if package modifications)
- Core deployment files only
Standard MARS package directory structure:
@@ -651,7 +800,7 @@ MARS_Packages/REL01/MARS-XXXX/
├── verify_packages_version.sql # Package verification script
├── ...
├── README.md # Package documentation
├── rollback_version/ # Backup of objects BEFORE changes (for rollback)
├── current_version/ # Backup of objects BEFORE changes (for rollback)
│ ├── PACKAGE_NAME.pkg # Previous package specification
│ └── PACKAGE_NAME.pkb # Previous package body
├── new_version/ # Updated objects AFTER changes (for installation)
@@ -677,12 +826,12 @@ MARS_Packages/REL01/MARS-XXXX/
- **Master scripts**: `install_marsXXXX.sql` and `rollback_marsXXXX.sql`
**Version Management Folders (for Database Object Modifications):**
- **`rollback_version/`** - Contains backup of database objects BEFORE changes (for rollback)
- **`current_version/`** - Contains backup of database objects BEFORE changes (for rollback)
- **`new_version/`** - Contains updated database objects AFTER changes (for installation)
**When to use version folders:**
- Required when MARS package modifies ANY existing database objects (packages, tables, views, indexes, triggers, etc.)
- Copy original object definitions to `rollback_version/` before making changes
- Copy original object definitions to `current_version/` before making changes
- Place modified object definitions in `new_version/` after changes
- Examples: FILE_MANAGER.pkg/pkb, A_SOURCE_FILE_CONFIG.sql (table), V_STATUS.sql (view), IDX_CONFIG.sql (index)
@@ -767,7 +916,19 @@ PROMPT Step 2: Second Installation Step
PROMPT =========================================================================
@@02_MARS_XXXX_install_step2.sql
-- ... more steps ...
-- ... more deployment steps ...
PROMPT
PROMPT =========================================================================
PROMPT Step N: Track Package Versions
PROMPT =========================================================================
@@track_package_versions.sql
PROMPT
PROMPT =========================================================================
PROMPT Final Step: Verify Package Versions
PROMPT =========================================================================
@@verify_packages_version.sql
PROMPT
PROMPT =========================================================================
@@ -791,7 +952,9 @@ quit;
7. **ACCEPT Validation**: User confirmation required before execution (safety feature)
8. **ALTER SESSION SET CURRENT_SCHEMA** (optional): Sets working schema for package operations
9. **@@ Includes**: All sub-scripts executed via `@@` command
10. **quit;**: Exits SQLcl/SQL*Plus after completion (important for automated deployments)
10. **track_package_versions.sql**: MANDATORY universal tracking script (must be included before verify)
11. **verify_packages_version.sql**: MANDATORY universal verification script (must be last step before completion)
12. **quit;**: Exits SQLcl/SQL*Plus after completion (important for automated deployments)
**SET ECHO OFF Benefits:**
- **Clean Output**: PROMPT messages appear only once in console and log files
@@ -841,6 +1004,114 @@ quit;
---
### Complete MARS Package Example
**MARS-835-PREHOOK** - Real-world example following all standards:
**File Structure:**
```
MARS_Packages/REL01_POST_DEACTIVATION/MARS-835-PREHOOK/
├── .gitignore
├── install_mars835_prehook.sql # Master install (uses universal scripts)
├── rollback_mars835_prehook.sql # Master rollback
├── 01_MARS_835_install_DATA_EXPORTER_SPEC.sql
├── 02_MARS_835_install_DATA_EXPORTER_BODY.sql
├── 91_MARS_835_rollback_DATA_EXPORTER_BODY.sql
├── 92_MARS_835_rollback_DATA_EXPORTER_SPEC.sql
├── track_package_versions.sql # ✅ Universal tracking
├── verify_packages_version.sql # ✅ Universal verification
├── README.md
├── current_version/
│ ├── DATA_EXPORTER.pkg # v2.1.1 (before changes)
│ └── DATA_EXPORTER.pkb
├── new_version/
│ ├── DATA_EXPORTER.pkg # v2.2.0 (after changes)
│ └── DATA_EXPORTER.pkb
└── log/ # Auto-created by install script
```
**track_package_versions.sql** (edited for this MARS issue):
```sql
-- ===================================================================
-- PACKAGE LIST - Edit this array to specify packages to track
-- ===================================================================
vPackageList t_string_array := t_string_array(
'CT_MRDS.DATA_EXPORTER' -- Only package modified in MARS-835
);
-- ===================================================================
```
**install_mars835_prehook.sql** (master script):
```sql
-- ===================================================================
-- MARS-835-PREHOOK INSTALL SCRIPT
-- ===================================================================
host mkdir log 2>nul
var filename VARCHAR2(100)
BEGIN
:filename := 'log/INSTALL_MARS_835_PREHOOK_' || SYS_CONTEXT('USERENV', 'CON_NAME') || '_' || TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.log';
END;
/
column filename new_value _filename
select :filename filename from dual;
spool &_filename
SET ECHO OFF
SET TIMING ON
SET SERVEROUTPUT ON SIZE UNLIMITED
PROMPT =========================================================================
PROMPT MARS-835-PREHOOK: DRY Refactoring for DATA_EXPORTER
PROMPT =========================================================================
ACCEPT continue CHAR PROMPT 'Type YES to continue: '
WHENEVER SQLERROR EXIT SQL.SQLCODE
BEGIN
IF UPPER(TRIM('&continue')) != 'YES' THEN
RAISE_APPLICATION_ERROR(-20001, 'Installation aborted');
END IF;
END;
/
WHENEVER SQLERROR CONTINUE
PROMPT
PROMPT Step 1: Deploy DATA_EXPORTER Package Specification (v2.2.0)
@@01_MARS_835_install_DATA_EXPORTER_SPEC.sql
PROMPT
PROMPT Step 2: Deploy DATA_EXPORTER Package Body (v2.2.0)
@@02_MARS_835_install_DATA_EXPORTER_BODY.sql
PROMPT
PROMPT Step 3: Track Package Versions
@@track_package_versions.sql
PROMPT
PROMPT Step 4: Verify Package Versions
@@verify_packages_version.sql
PROMPT
PROMPT =========================================================================
PROMPT MARS-835-PREHOOK Installation - COMPLETED
PROMPT =========================================================================
spool off
quit;
```
**Why this is the correct pattern:**
- ✅ Uses universal `track_package_versions.sql` (no custom 04_MARS_835_track_version.sql)
- ✅ Uses universal `verify_packages_version.sql` (no custom 03_MARS_835_verify_installation.sql)
- ✅ Tracking happens AFTER deployment (Step 3)
- ✅ Verification happens LAST (Step 4) to confirm everything is correct
- ✅ Single configuration point (edit package list in track_package_versions.sql)
- ✅ Consistent with ALL other MARS packages
- ✅ Easy to copy/paste for new MARS issues
---
### SPOOL Logging Benefits
**Why SPOOL is mandatory:**
@@ -1292,7 +1563,7 @@ Before creating a MARS package, ensure:
- [ ] README.md documents installation process
- [ ] Rollback scripts reverse all changes
- [ ] Rollback includes verification step (@@test/verify_packages_version.sql)
- [ ] **rollback_version/ folder**: Contains backup of objects before changes (if modifying packages)
- [ ] **current_version/ folder**: Contains backup of objects before changes (if modifying packages)
- [ ] **new_version/ folder**: Contains updated objects after changes (if modifying packages)
- [ ] **test/ folder**: All test files and verification scripts organized in subfolder
- [ ] **log/ folder**: SPOOL log files automatically created by master scripts
@@ -1320,7 +1591,7 @@ MARS_Packages/REL01/MARS-1046/
├── track_package_versions.sql # Version tracking
├── verify_packages_version.sql # Package verification
├── README.md # Comprehensive documentation
├── rollback_version/ # v3.3.0 backup for rollback
├── current_version/ # v3.3.0 backup for rollback
│ ├── FILE_MANAGER.pkg
│ └── FILE_MANAGER.pkb
├── new_version/ # v3.3.1 updated packages
@@ -1342,7 +1613,7 @@ MARS_Packages/REL01/MARS-1046/
- SPOOL logging: `INSTALL_MARS_1046_<PDB>_<timestamp>.log`
- ACCEPT validation: Requires explicit "YES" to proceed (both install & rollback)
- quit; command: Clean SQLcl exit after completion
- Version folders: rollback_version/ (v3.3.0) and new_version/ (v3.3.1)
- Version folders: current_version/ (v3.3.0) and new_version/ (v3.3.1)
- Test subfolder: All test files organized separately
- 4-step workflow: Install packages → Track version → Verify packages → quit
- Full rollback: Restore to previous version with verification
@@ -1409,7 +1680,7 @@ Move-Item -Path "*.log" -Destination "log" -Force
**Step 4: Verify clean structure**
```powershell
# Check root directory - should only have deployment scripts and README
Get-ChildItem | Where-Object { $_.Name -notmatch "^(01|02|91|92|install|rollback|README|rollback_version|new_version|test|log)" }
Get-ChildItem | Where-Object { $_.Name -notmatch "^(01|02|91|92|install|rollback|README|current_version|new_version|test|log)" }
# Expected: No output (all non-deployment files moved)
```
@@ -1425,7 +1696,7 @@ MARS_Packages/REL01/MARS-XXXX/
├── track_package_versions.sql
├── verify_packages_version.sql
├── README.md # Documentation
├── rollback_version/ # Backup packages
├── current_version/ # Backup packages
├── new_version/ # Updated packages
└── test/ # ALL test artifacts
├── test_marsXXXX.sql