MS PowerShell und Oracle interaktiv intuitiv - inspirativ Holger Bär
1 Einführung in die PowerShell 2 Powershell und Oracle 3 Einsatz in der Praxis
EINFÜHRUNG IN DIE POWERSHELL
Herunterladen kann sie jeder,doch richtig kennen und schätzen zu lernen werden sie, gerade am Anfang, nur wenige. Nehmen Sie sich am besten die nächsten drei Wochen frei, um alle Details kennen zu lernen. Sie werden die nächsten 30 Jahre davon profitieren. Peter Monadjemi Windows PowerShell Crashkurs
Common Model for Admin Interfaces Common Model for developing administrative Interfaces Altes Modell Neues Modell Scripts MMC Snap-IN Application Misc. Grafisches Adminstratives Tool (z.b. MMC) Windows PowerShell Commandlets Windows oder Server Produkt Funktionalität Microsoft.NET Framework Command LineTool Component Object Model (COM) WMI Klassen Windows oder Server Produkt Funktionalität
Einflußfaktoren
Commandlets (Cmdlet) PowerShell-Befehle heißen Commandlets bzw. Cmdlets - 129 Befehle eingebaut Allgemeine Syntax: - Verb-Substantiv [-Parameterliste] Beispiele: - get-help, get-location, get-command - get-childitem c:\daten, set-location c:\windows, remove-item Ausserdem: - Berechnungen: 10* (8 + 6) - Aufruf DOS-/Windows-EXEs: c:\windows\notepad.exe - Aufruf WSH-Skriptdateien:.vbs,.js,.vbe,.wsf, etc. - Aufruf Windows-Dokumente:.pdf,.doc,.xls, etc.
Secure by default Sicherheit ist ein zentraler Aspekt der PowerShell Standardmäßig ist nur der interaktiver Gebrauch erlaubt Sollen Scripte ausgeführt werden, so muß die Ausführungsrichtlinie (ExecutionPolicy) geändert werden Scriptfiles (.ps1) werden standardmäßig mit Notepad geöffnet Aber: PowerShell ist durch "Secure by Default" keine Alternative für Login-Scripte
Variablen Variablen beginnen mit vorangestellten $ Dollarzeichen. $a=42 $a="hello World" $a=[int] 42 $a=[datetime] "12/24/2007" Das Voranstellen des Typnamens [int] $a =5 bewirkt, daß die Variable nur Daten diese Typs aufnehmen kann. (Strenge Typisierung wie Java, C++ oder C#)
Arrays Einfache Arrays über kommaseparierte Liste oder @(, ) $a = "a", "b", "c" oder $a = @("a", "b", "c") $n = 1, 2, 3 oder $n=@(1,2,3) Leerer Array $leer=@() Mehrdimensionaler Array $ma = @( ("a", 1),("b", 2), ("c",3) ) Zugriff auf Elemente (Beginn bei Null) $a[0] $n[2] $ma[0][1]
Navigationsbefehle Cmdlet Alias Beschreibung Set-Location cd, chdir Festlegen des Standorts (Providerwechsel mit Doppelpunkt) Get-Location pwd Abruf des aktuellen Standorts Get-ChildItem dir, ls Auflisten der Elemente Get-Contents type, cat Abruf des Elementinhalts New-Item md, mkdir Erstellen eines Elements (Ast oder Blatt)
Vergleichsoperatoren Vergleichs -operator Groß/Kleinschreibung ignorieren Vergleichsoperator Groß/Kleinschreibung beachten Bedeutung -eq -ceq Gleich -ne -cne Ungleich -gt -cgt Größer als -ge -cge Größer oder Gleich als -lt -clt Kleiner als -le -cle Kleiner oder Gleich als -match -cmatch entspricht (nicht so streng wie gleich) (Regular Expression) -notmatch -cnotmatch entspricht nicht (Regular Expression) -like -clike wie (wildcards) -notlike -cnotlike nicht wie (Wildcards)
Vergleichsoperatoren Vergleichsoperator -contains -notcontains Bedeutung enthält (für Collections) enthält nicht (für Collections) -replace ersetze (Suche mit Regular Expression möglich) -is -isnot Ist vom Typ Ist nicht vom Typ
Objektpipeline Weitergabe von.net Objekten und nicht von unstrukturierten Daten (Strings) Pipelineoperator (Verkettungszeichen): Das aktuelle Pipelineobjekt: $_ Get-Process Where-Object { $_.cpu gt 5 } Sort-Object cpu Format-Table Cmdlet #4 Format Class Cmdlet #3 Sort Class Cmdlet #2 Where Class Cmdlet #1 Get-Process Class Windows PowerShell Pipeline Processor
Kontrollstrukturen if (Bedingung) { } elseif { } else { } for ([Initialisierer]; [Bedingung]; [Iterator]) { } switch ($var) { Wert: { } } while(bedingung) { } do { } while (Bedingung) do { } until (Bedingung) foreach ($var in $menge) { } function name { } return throw "Fehlertext" trap Fehlerklasse { } else { } throw Fehlerklasse exit continue break
Kommentare und Zeilenaufteilung Kommentare: # Pipeline Befehlstrenner ; Befehl ; Befehl ; Befehl
Websites zur PowerShell PowerShell Team blog: http://blogs.msdn.com/powershell/ Newsgroup: Microsoft.Public.Windows.PowerShell Microsoft PowerShell Script Center www.microsoft.com/technet/scriptcenter/hubs/msh.mspx PowerShell Community: http://www.powershellcommunity.org Karl Prosser/Tobias Weltner powershelllive.com Holger Schwichtenberg www.it-visions.de Marc van Orsouw s blog http://mow001.blogspot.com Lee Holmes http://www.leeholmes.com/blog/ Powershell Beispiele http://www.scriptinganswers.com PowerGui http://www.powergui.org
POWERSHELL UND ORACLE
PowerShell und Oracle Voraussetzungen Zugriff auf Oracle DB über ODP.Net Öffnen einer Connection Verwendung des OracleCommand Objekts Einsatz von Parametern Verwendung des DataReaders Performance Betrachtungen
PowerShell und Oracle Installation.Net 2.0 oder höher Oracle Client / Instant Client ODP.Net für Oracle 9i, 10g oder 11g für.net 2.0 Verwendung Aufruf im Skript: [Reflection.Assembly]::LoadWithPartialName("Oracle.D ataaccess")
Verbindungsaufbau PowerShell und Oracle Erzeugen eines ConnectionObjects $constr = "User Id=hb;Password=hb;Data Source=localhost:/isen" $conn= New-Object \ Oracle.DataAccess.Client.OracleConnection($constr) $conn.open()
Datenzugriff PowerShell und Oracle Erzeugen eines CommandObjects (egal ob Stored Procedure, DML/DDL) $command = New-Object Oracle.DataAccess.Client.OracleCommand( DOAG.DEMO, $dbconnection) ODER $command = $conn.createcommand() $command.commandtext = DOAG.DEMO
Datenzugriff - Fortsetzung Setzen des CommandTyps $command.commandtype= PowerShell und Oracle [Text StoredProcedure TableDirect] Ausführen des Commandos $command.executenonquery() $command.executereader() $command.executescalar() $command.executestream() demo0.ps1, demo1.ps1
PowerShell und Oracle Parameter Platzhalter im SQL-Text lassen $command.commandtext= insert into emp (empno, ename) values (:1, :2) Automatisch bei Stored Procedures $command.commandtext= doag.one_param
Parameter - Fortsetzung Parameter erzeugen Typ und Richtung angeben Binden Wert setzen PowerShell und Oracle $param = New-Object Oracle.DataAccess.Client.OracleParameter() $param.dbtype = Int32 $command.parameters.add($param) $param.value=8911 demo2.ps1
Parameter - Fortsetzung PowerShell und Oracle RefCursor Ein Parameter wie (fast) jeder andere kann als Eingabe für weitere Prozedur verwendet werden kann direkt ausgelesen werden über einen DataReader $param = NewParam 'RefCursor' 'Output' $doag_demo.parameters.add($param) $reader = $doag_demo.executereader() while ($reader.read()) { $reader.getstring(1) } demo5
Performance Betrachtungen PowerShell und Oracle Automatische Optimierungen Connection Pooling Cursor Caching / Statement Cache ab 11g: Result Cache demo2,demo3
Performance Betrachtungen PowerShell und Oracle Manuelle Optimierungen Autocommit vermeiden FetchSize anpassen Bulk Operationen demo3/demo4,demo5, demo6/demo7
PowerShell und Oracle Metalink Note 848177.1 http://guyharrison.typepad.com/oracleguy/2008/01/accessingoracl.html
POWERSHELL IM PRAXISEINSATZ
Powershell im Praxiseinsatz Datenmanagementsystem - Anbindung eines Archivsystems 80TB - Skripting mit Powershell - Auslagern/Rücklagern von Daten über Applikation steuern
Aufgaben Aus-/Rücklagerung Auslagern - Auslesen der betroffenen Daten aus der Datenbank - Zusammenpacken der Datenverzeichnisse in ZIP-Datei - Verlagern in Auslagerungsdatenbereich - Statusmeldung an DB Rücklagern - Auslesen der angeforderten Daten aus der Datenbank - Entpacken der ZIPDatei - Verlagern in Online Bereich - Statusmeldung an DB
Probleme Zeitgesteuerter Skriptablauf mit Cron! Beim Ausloggen: Abbruch des Skripts! Synchronisation über Lock-Dateien Lösung: PowerShell als Service PowerShell als Service - Aufruf mit vollständigem Pfad (Leerzeichen)
Powershell als Service Service einrichten mit srvany - HKLM\LocalMachine\System\Services\CurrentControlSet\Ps Service\Parameters : Application C:\WINDOWS\system32\WindowsPowerShell\v1.0\powe rshell.exe -noninteractive -nologo -noprofile -command "cd 'C:\Program Files\PowershellSkripte'; &./Auslagern_service.ps1" - AppDirectory setzen reicht leider nicht! Einbetten in eigene Anwendung http://www.codeproject.com/kb/cs/howtorunpowershell.aspx
Fazit Kombination aus.net und Skripting ergibt starkes Duo Interaktives Arbeiten durch Objekt-Inspektion verkürzt Entwicklungszeit Administratoren und Entwickler benutzen die gleichen Tools Effiziente Datenverarbeitung in Skripten sehr einfach
Vielen Dank für Ihre Aufmerksamkeit Holger Bär science + computing AG Telefon: 07071 9457-559 www.science-computing.de E-Mail: h.baer@science-computing.de