Exchange DAG: Prüfen ob alle Datenbanken auf den originalen Servern gemountet sind

Ich arbeite aktuell an einem DAG welches aus acht Servern mit vielen Datenbanken besteht. Um, zu prüfen, ob alle Datenbanken auf ihren originalen Servern gemountet sind, habe ich mir folgendes kleines Skript geschrieben:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Get-MailboxDatabase | Sort Name | ForEach{
    $db = $_.Name
    $ActivServer = $_.Server.Name
    $OriginServer = $_.ActivationPreference | ? {$_.Value -eq 1}


    If ($ActivServer -ne $OriginServer.Key)
    {
        Write-Host “$db auf $ActivServer soll bevorzugt auf $($OriginServer.Key) laufen – FALSCH” -ForegroundColor Red
  
    }
    Else
    {
        Write-Host “$db auf $ActivServer soll bevorzugt auf $($OriginServer.Key) laufen - OK” -ForegroundColor Green
    }
}

Das Skript gibt aus, ob eine Datenbank auf einem "falschen" Server läuft und wo sie gemountet werden sollte.
Zur optischen Unterstützung werden die Einträge rot und grün eingefärbt.

Oracle - Datentyp NUMBER(m,n) wird in Access als DECIMAL(m,n) mit Problemen in den Nachkommastallen eingebunden.

Problem:
Um in Microsoft Access Tabellen von „echten“ Datenbanken einzubinden wird i.d.R der datenbankeigene ODBC-Treiber verwendet, um u.a. Datentypen in die jeweils bekannten Formate umzusetzen.
Dieses ist bei Oracle nicht optimal gelöst. Seit ein paar Versionen wird der Oracle Datentyp NUMBER(m,n) in Microsoft Access als Decimal umgesetzt (vorher DOUBLE). Hierbei gehen die Nachkommstellen verloren.

Lösung:
Dem ODBC Treiber etwas vorgaukeln. Der ODBC Treiber liest seine Informationen aus der Systemtabelle sys.all_tab_columns, spricht diese View allerdings über den PUBLIC SYNONYM all_tab_columns an. Gleichnamige eigene Objekte werden aber vor den PUBLIC SYNONYM gelesen.

Diese View im Schema des USERS der die Einbíndung ausführt erstellen:
CREATE VIEW all_tab_columns AS
SELECT owner, table_name, column_name, data_type, data_type_mod, data_type_owner,
       data_length,
       CASE WHEN data_type = 'NUMBER' AND data_scale > 0 THEN NULL ELSE data_precision END  data_precision,
       CASE WHEN data_type = 'NUMBER' AND data_scale > 0 THEN NULL ELSE data_scale END  data_scale,
       nullable, column_id, default_length,
       data_default, num_distinct, low_value, high_value, density, num_nulls,
       num_buckets, last_analyzed, sample_size, character_set_name, char_col_decl_length,
       global_stats, user_stats, avg_col_len, char_length, char_used, v80_fmt_image,
       data_upgraded
FROM sys.all_tab_columns

Mit dieser Änderung werden nur die NUMBER(m,0) als Decimal eingebunden, alle NUMBER(m,n) mit n > 0 werden als Double eingebunden.

Dieses ist getestet mit Oracle Sever 9.2.0.7.0 und 11.2.0.3.0.jeweils mit den ODBC Client 11.01.00.07. Die Struktur dieser „lokalen Systemtabelle“ muss der sys.all_tab_columns entsprechen (versionsabhängig)
Nicht die View im SYS-Schema anpassen !!


“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)