Zacząłem pisać ps moduł do bazy danych w Oraclu. Kod źródłowy jest na
githubie.
Na samym początku należy zainicjalizować moduł.
Load-OracleAssemblyes 'path_to_oracle_dataacces_dir\Oracle.DataAccess.dll'
Będziemy mogli przeglądać hasła oraz przeglądać połączenia w TNS:
$secPass, $pass = Get-Password
Get-TnsOracleConnectionString | Out-GridView
Można pobrać połączenie z app.configu oraz sprawdzić wersję servera:
$connectStr = Get-ConfigConnectionString 'path_to_app_dir\App.config' DatabaseNr1
Get-OracleServerVersion $connectStr
A wywoływanie zapytania SQL jest bardzo proste. Poniżej jest przykład zapisania do csv wszystkich obiektów w bazie danych, które stworzyliśmy dla schematu 'my':
$conn = new-OracleConnection $connectStr
$conn.Open()
$dbObj =Get-OracleDataTable -conn $conn -sql "select * from all_objects where owner like 'my' order by last_ddl_time desc"
$conn.Close()
$dbObj | Export-Csv -Path 'LastChangedObjects.csv'
Oczywiście można wywołać polecenie z pliku, gdzie znajduję się zapytanie sql:
Get-OracleDataTable -file file.sql -conn $conn
Gdy będziemy przeglądać rekordy w bardzo dużej tabeli to będziemy mogli uzyskać wyjątek z brakiem pamięci:
Błąd powyższy odnosi się do braku pamięci:
#out-lineoutput : Exception of type 'System.OutOfMemoryException' was thrown.
# + CategoryInfo : NotSpecified: (:) [out-lineoutput], OutOfMemoryException
# + FullyQualifiedErrorId : System.OutOfMemoryException,Microsoft.PowerShell.Commands.OutLineOutputCommand
Wtedy zamiast ładować wszystko do adaptera to można odczytywać z DataReader'a:
$reader = Get-OracleDataReader -conn $conn -sql "select * from all_objects"
while($reader.Reader())
{
# operacja na reader
}
Dodatkową funkcjonalnością jest porównywanie tabel dla różnych baz danych. Poniżej jest przykład sprawdzenia czy na 2 bazach są takie same tabele z takim samym właścicielem (owner) i z taką samą ilością rekordów:
$connStr1 = 'Data Source=...'
$connStr2 = 'Data Source=...'
$conn1 = New-OracleConnection $connStr1
$conn2 = New-OracleConnection $connStr2
$allTables1 = Get-OracleSystemTables -conn $conn1 -SystemTable ALL_TABLES
$allTables2 = Get-OracleSystemTables -conn $conn2 -SystemTable ALL_TABLES
Compare-Object
($allTables1 | select TABLE_NAME,OWNER,NUM_ROWS)
($allTables2 | select TABLE_NAME,OWNER,NUM_ROWS) -IncludeEqual