Files
mars/confluence/additions/AGGREGATED_ALLOTMENT_Problem_Resolution.md
Grzegorz Michalski ecd833f682 Init
2026-02-02 10:59:29 +01:00

222 lines
6.4 KiB
Markdown

# AGGREGATED_ALLOTMENT External Tables - Rozwiązanie problemów
## 🔍 Diagnoza problemów
### Problem który napotkałeś:
```sql
SELECT COUNT(*) FROM ODS.TOP_AGGREGATED_ALLOTMENT_ODS;
-- ORA-29913: error while processing ODCIEXTTABLEOPEN routine
-- ORA-20401: Authorization failed
```
### Przyczyny problemów:
#### 1. **Brak uprawnień do external tables**
- External tables zostały utworzone w schemacie **ODS**
- Próbujesz dostępu z schematu **CT_MRDS**
- Brak uprawnień SELECT na ODS.TOP_AGGREGATED_ALLOTMENT_*
#### 2. **Niepoprawna konfiguracja ARCHIVE table**
- **Użyty prefix:** `ARCHIVE/TOP/AGGREGATED_ALLOTMENT`
- **Faktyczne pliki:** `TOP/AGGREGATED_ALLOTMENT/YEAR=2025/MONTH=08/*.parquet`
- **Problem:** PARQUET files z Hive partitioning wymagają specjalnej konfiguracji
#### 3. **Weryfikacja plików** ✅
```bash
# ODS bucket - pliki CSV istnieją
oci os object list --bucket-name data --prefix "ODS/TOP/AGGREGATED_ALLOTMENT/"
# ✅ 14 plików CSV
# ARCHIVE bucket - pliki PARQUET z partycjonowaniem Hive
oci os object list --bucket-name history --prefix "ARCHIVE/TOP/AGGREGATED_ALLOTMENT/"
# ❌ Brak plików w tej lokalizacji
oci os object list --bucket-name history --prefix "TOP/AGGREGATED_ALLOTMENT/"
# ✅ 8 plików PARQUET w strukturze YEAR=2025/MONTH=08/
```
## 🔧 Rozwiązania
### Rozwiązanie 1: Nadanie uprawnień
```sql
-- Jako ODS user lub ADMIN
GRANT SELECT ON ODS.TOP_AGGREGATED_ALLOTMENT_ODS TO CT_MRDS;
GRANT SELECT ON ODS.TOP_AGGREGATED_ALLOTMENT_INBOX TO CT_MRDS;
GRANT SELECT ON ODS.TOP_AGGREGATED_ALLOTMENT_ARCHIVE TO CT_MRDS;
-- Test z CT_MRDS
SELECT COUNT(*) FROM ODS.TOP_AGGREGATED_ALLOTMENT_ODS;
```
### Rozwiązanie 2: Poprawa konfiguracji ARCHIVE table
```sql
-- Jako ODS user
DROP TABLE TOP_AGGREGATED_ALLOTMENT_ARCHIVE;
-- Poprawne utworzenie z właściwym prefixem
BEGIN
FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
pTableName => 'TOP_AGGREGATED_ALLOTMENT_ARCHIVE',
pTemplateTableName => 'CT_ET_TEMPLATES.TOP_AGGREGATED_ALLOTMENT',
pPrefix => 'TOP/AGGREGATED_ALLOTMENT', -- Bez "ARCHIVE/" prefix
pBucketUri => CT_MRDS.ENV_MANAGER.gvArchiveBucketUri
);
END;
/
```
### Rozwiązanie 3: Alternatywne podejście - tworzenie w CT_MRDS
```sql
-- Jako CT_MRDS user - utwórz external tables w swoim schemacie
BEGIN
CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE(
pTableName => 'TOP_AGGREGATED_ALLOTMENT_ODS_CT',
pTemplateTableName => 'CT_ET_TEMPLATES.TOP_AGGREGATED_ALLOTMENT',
pPrefix => 'ODS/TOP/AGGREGATED_ALLOTMENT',
pBucketUri => CT_MRDS.ENV_MANAGER.gvDataBucketUri
);
END;
/
BEGIN
CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE(
pTableName => 'TOP_AGGREGATED_ALLOTMENT_ARCHIVE_CT',
pTemplateTableName => 'CT_ET_TEMPLATES.TOP_AGGREGATED_ALLOTMENT',
pPrefix => 'TOP/AGGREGATED_ALLOTMENT',
pBucketUri => CT_MRDS.ENV_MANAGER.gvArchiveBucketUri
);
END;
/
```
## 🧪 Testowanie rozwiązań
### Test 1: Weryfikacja external locations
```sql
SELECT table_name, location
FROM all_external_locations
WHERE table_name LIKE '%TOP_AGGREGATED_ALLOTMENT%'
AND owner IN ('ODS', 'CT_MRDS')
ORDER BY owner, table_name;
```
### Test 2: Próba dostępu do danych
```sql
-- Test ODS (pliki CSV)
SELECT COUNT(*) FROM ODS.TOP_AGGREGATED_ALLOTMENT_ODS;
-- Test pierwszych 5 rekordów
SELECT * FROM ODS.TOP_AGGREGATED_ALLOTMENT_ODS WHERE ROWNUM <= 5;
```
### Test 3: Weryfikacja ARCHIVE (pliki PARQUET)
```sql
-- Test ARCHIVE (pliki PARQUET z partycjonowaniem)
SELECT COUNT(*) FROM ODS.TOP_AGGREGATED_ALLOTMENT_ARCHIVE;
-- Sprawdzenie partycji
SELECT DISTINCT year, month
FROM ODS.TOP_AGGREGATED_ALLOTMENT_ARCHIVE
ORDER BY year, month;
```
## 📊 Struktura plików w buckets
### Data bucket (ODS) - format CSV
```
data/
└── ODS/
└── TOP/
└── AGGREGATED_ALLOTMENT/
├── AGGREGATED_ALLOTMENT_202508_1_*.csv
├── AGGREGATED_ALLOTMENT_202508_2_*.csv
├── AGGREGATED_ALLOTMENT_202509_1_*.csv
└── ... (14 plików CSV)
```
### History bucket (ARCHIVE) - format PARQUET z partycjonowaniem Hive
```
history/
└── TOP/
└── AGGREGATED_ALLOTMENT/
└── YEAR=2025/
├── MONTH=08/
│ ├── 202508_1_*.parquet
│ ├── 202508_2_*.parquet
│ ├── 202508_3_*.parquet
│ └── 202508_4_*.parquet
└── MONTH=09/
├── 202509_1_*.parquet
├── 202509_2_*.parquet
├── 202509_3_*.parquet
└── 202509_4_*.parquet
```
## ⚠️ Uwagi dotyczące FILE_MANAGER
### Automatyczna detekcja formatu
Pakiet `FILE_MANAGER.CREATE_EXTERNAL_TABLE` automatycznie wykrywa format na podstawie `pBucketUri`:
- **Jeśli** `pBucketUri` zawiera `gvArchiveBucketUri` → format PARQUET z partycjonowaniem Hive
- **Jeśli** `pBucketUri` zawiera `gvDataBucketUri` lub `gvInboxBucketUri` → format CSV
### Konfiguracja środowiska
```sql
-- Sprawdzenie konfiguracji ENV_MANAGER
SET SERVEROUTPUT ON;
DECLARE
v_inbox VARCHAR2(4000);
v_data VARCHAR2(4000);
v_history VARCHAR2(4000);
BEGIN
v_inbox := CT_MRDS.ENV_MANAGER.gvInboxBucketUri;
v_data := CT_MRDS.ENV_MANAGER.gvDataBucketUri;
v_history := CT_MRDS.ENV_MANAGER.gvArchiveBucketUri;
DBMS_OUTPUT.PUT_LINE('Inbox: ' || v_inbox);
DBMS_OUTPUT.PUT_LINE('Data: ' || v_data);
DBMS_OUTPUT.PUT_LINE('History: ' || v_history);
END;
/
```
## 🎯 Zalecane działania
### Krok 1: Nadaj uprawnienia (NAJSZYBSZE)
```sql
-- Jako ADMIN lub z uprawnieniami GRANT
GRANT SELECT ON ODS.TOP_AGGREGATED_ALLOTMENT_ODS TO CT_MRDS;
GRANT SELECT ON ODS.TOP_AGGREGATED_ALLOTMENT_INBOX TO CT_MRDS;
```
### Krok 2: Przebuduj ARCHIVE table
```sql
-- Jako ODS user
DROP TABLE TOP_AGGREGATED_ALLOTMENT_ARCHIVE;
BEGIN
FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
pTableName => 'TOP_AGGREGATED_ALLOTMENT_ARCHIVE',
pTemplateTableName => 'CT_ET_TEMPLATES.TOP_AGGREGATED_ALLOTMENT',
pPrefix => 'TOP/AGGREGATED_ALLOTMENT',
pBucketUri => CT_MRDS.ENV_MANAGER.gvArchiveBucketUri
);
END;
/
-- Nadaj uprawnienia
GRANT SELECT ON TOP_AGGREGATED_ALLOTMENT_ARCHIVE TO CT_MRDS;
```
### Krok 3: Test końcowy
```sql
-- Z schematu CT_MRDS
SELECT 'ODS' as source, COUNT(*) as row_count FROM ODS.TOP_AGGREGATED_ALLOTMENT_ODS
UNION ALL
SELECT 'ARCHIVE' as source, COUNT(*) as row_count FROM ODS.TOP_AGGREGATED_ALLOTMENT_ARCHIVE;
```
Teraz external tables powinny działać poprawnie! 🎉