Files
ROMFASTSQL/proxmox/lxc108-oracle/roa-windows-setup/scripts/04-create-synonyms-grants.ps1
Marius aaf5942f6b Fix 04-create-synonyms-grants.ps1 to use SQL files instead of inline SQL
The script had inline SQL that was missing 20 synonyms compared to
synonyms-public.sql, causing PACK_DEF and other packages to fail with
missing synonym errors (SYN_VNOM_UM_ISO, SYN_ATAS_*, SYN_SAL_*, etc.).

Changes:
- Remove all inline SQL (~350 lines)
- Now runs synonyms-public.sql (81 synonyms vs 61 before)
- Now runs grants-public.sql for all grants and ACL
- Add verification of SESIUNE context

This ensures the script stays in sync with the SQL files and
prevents future desync issues.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 00:30:12 +02:00

222 lines
7.6 KiB
PowerShell

#Requires -Version 5.1
<#
.SYNOPSIS
Create public synonyms and grants for ROA Oracle.
.DESCRIPTION
Creates public synonyms for CONTAFIN_ORACLE objects and configures:
- Public synonyms for tables, views, packages, types (via synonyms-public.sql)
- Public grants (SELECT, EXECUTE, REFERENCES) (via grants-public.sql)
- SESIUNE context
- Network ACL for CONTAFIN_ORACLE
.PARAMETER OracleHome
Oracle home directory. If not specified, auto-detects.
.PARAMETER ServiceName
Database service name. Default: XEPDB1
.PARAMETER SystemPassword
SYSTEM user password. Default: romfastsoft
.PARAMETER SqlScriptsDir
Directory containing SQL scripts. Default: ..\sql
.EXAMPLE
.\04-create-synonyms-grants.ps1
.EXAMPLE
.\04-create-synonyms-grants.ps1 -ServiceName "ROA" -SystemPassword "mypassword"
.NOTES
File Name : 04-create-synonyms-grants.ps1
Prerequisite : Run 03-import-contafin.ps1 first
Copyright 2024 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[string]$SqlScriptsDir
)
$ErrorActionPreference = 'Stop'
# Source library functions
. "$PSScriptRoot\lib\logging-functions.ps1"
. "$PSScriptRoot\lib\oracle-functions.ps1"
# Initialize logging
$logPath = Join-Path $PSScriptRoot "..\logs\04-create-synonyms-grants_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
Initialize-LogFile -LogPath $logPath -ScriptName "04-create-synonyms-grants.ps1"
try {
Write-LogSection "Creating Public Synonyms and Grants"
# Validate Oracle installation
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
# Determine SQL scripts directory
if (-not $SqlScriptsDir) {
$SqlScriptsDir = Join-Path $PSScriptRoot "..\sql"
}
# Verify SQL files exist
$synonymsScript = Join-Path $SqlScriptsDir "synonyms-public.sql"
$grantsScript = Join-Path $SqlScriptsDir "grants-public.sql"
if (-not (Test-Path -Path $synonymsScript)) {
throw "synonyms-public.sql not found at $synonymsScript"
}
if (-not (Test-Path -Path $grantsScript)) {
throw "grants-public.sql not found at $grantsScript"
}
Write-Log "SQL scripts directory: $SqlScriptsDir"
# Test connection
Write-Log "Testing database connection..."
if (-not (Test-OracleConnection -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword)) {
throw "Cannot connect to database. Please verify ServiceName and SystemPassword."
}
Write-LogSuccess "Database connection successful"
# Verify CONTAFIN_ORACLE exists and has objects
Write-Log "Verifying CONTAFIN_ORACLE schema..."
$counts = Get-SchemaObjectCount -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword -SchemaName "CONTAFIN_ORACLE"
$totalObjects = if ($counts['TOTAL']) { $counts['TOTAL'] } else { 0 }
if ($totalObjects -eq 0) {
throw "CONTAFIN_ORACLE schema has no objects. Run 03-import-contafin.ps1 first."
}
Write-LogSuccess "CONTAFIN_ORACLE has $totalObjects objects"
# =========================================================================
# STEP 1: Create Public Synonyms (using synonyms-public.sql)
# =========================================================================
Write-LogSection "Creating Public Synonyms"
Write-Log "Running synonyms-public.sql..."
$result = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlFile $synonymsScript -AsSysdba
if ($result -match "synonym_count|SYNONYM_NAME") {
Write-LogSuccess "Public synonyms created successfully"
}
else {
Write-LogWarning "Could not verify synonym creation"
Write-LogDebug $result
}
# =========================================================================
# STEP 2: Create Grants and ACL (using grants-public.sql)
# =========================================================================
Write-LogSection "Creating Grants and Network ACL"
Write-Log "Running grants-public.sql..."
$grantsResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlFile $grantsScript -AsSysdba
if ($grantsResult -match "Grant|ACL|Grants Complete") {
Write-LogSuccess "Grants and ACL configured successfully"
}
else {
Write-LogWarning "Could not verify grants configuration"
Write-LogDebug $grantsResult
}
# =========================================================================
# STEP 3: Verify Results
# =========================================================================
Write-LogSection "Verifying Configuration"
# Count synonyms
$countSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT 'SYNONYM_COUNT:' || COUNT(*)
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND table_owner = 'CONTAFIN_ORACLE';
EXIT;
"@
$countResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $countSql -Silent
$synonymCount = 0
if ($countResult -match "SYNONYM_COUNT:(\d+)") {
$synonymCount = [int]$Matches[1]
}
Write-Log "Public synonyms for CONTAFIN_ORACLE: $synonymCount"
# Verify SESIUNE context exists (created by grants-public.sql or synonyms-public.sql)
$contextSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT 'CONTEXT_EXISTS:' || COUNT(*)
FROM dba_context
WHERE namespace = 'SESIUNE';
EXIT;
"@
$contextResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $contextSql -Silent
$contextExists = $false
if ($contextResult -match "CONTEXT_EXISTS:(\d+)") {
$contextExists = [int]$Matches[1] -gt 0
}
if ($contextExists) {
Write-LogSuccess "SESIUNE context exists"
}
else {
Write-LogWarning "SESIUNE context not found - creating..."
$createContextSql = @"
CREATE CONTEXT SESIUNE USING CONTAFIN_ORACLE.SET_VARIABILE;
EXIT;
"@
Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $createContextSql -AsSysdba
}
# =========================================================================
# Summary
# =========================================================================
Write-LogSection "Setup Complete"
Write-LogSuccess "Public synonyms and grants configured!"
Write-Log ""
Write-Log "Summary:"
Write-Log " SQL scripts used:"
Write-Log " - synonyms-public.sql (all public synonyms)"
Write-Log " - grants-public.sql (all grants and ACL)"
Write-Log " Public synonyms created: $synonymCount"
Write-Log " SESIUNE context: $(if ($contextExists) { 'Verified' } else { 'Created' })"
Write-Log " Network ACL: Configured (roaupdate.xml)"
Write-Log ""
Write-Log "Next steps:"
Write-Log " 1. Run 05-import-companies.ps1 to import company schemas"
Close-LogFile -Success $true
exit 0
}
catch {
Write-LogError "Setup failed: $_"
Write-LogError $_.ScriptStackTrace
Close-LogFile -Success $false
exit 1
}