#!/usr/bin/ksh #Script zum Anlegen von Indizes #Patrick Wessel, Juli 2017 #Variablen deklarieren TABELLE=$1 #Uebergebener Tabellennname FELDER=$2 #Uebergebene Feldnamen RC=1 #Returncode Pruefung sqlplus Lauf SUCHRC=1 #Returncode Pruefung Feldpruefung #Konstanten deklarieren DATUM=`date '+%d%m%Y_%H%M%S'` #Datum fuer die Logfiles SCHEMA=$dbs_ora_schema #Schema fuer die Indizes SQLGETTABINFO=get_$(echo $TABELLE | tr '/' '_')_info_${DATUM}.sql #SQL Script zum Ermitteln der Tabellenfelder SQLGETTABINFOLOG=$SQLGETTABINFO.log #Logfile fuer SQL Script zum Ermitteln der Tabellenfelder SQLCREATEINDEX=create_$(echo $TABELLE | tr '/' '_')_${DATUM}.sql #SQL Script zum Erstellen der Indizes SQLCREATEINDEXLOG=$SQLCREATEINDEX.log #Logfile fuer SQL Script zum der Indizes PROZENT=10 #Samplesize fuer die Analyse des DB Objects ZEILEN=5 #Mindestanzahl an Zeilen in den SQL Script Dateien bevor diese ausgeführt werden. #Uebergabe Parameter pruefen [ "$TABELLE" == "" ] && echo "\n*** Fehler: Es wurde keine Tabelle angegeben" && exit 1 [ "$FELDER" == "" ] && echo "\n*** Fehler: Es wurden keine Felder fuer den Index angeben" && exit 1 #Bestehende SQL Scripts und Logfiles umbennen [ -f $SQLCREATEINDEX ] && mv $SQLCREATEINDEX $SQLCREATEINDEX.bak [ -f $SQLGETTABINFO ] && mv $SQLGETTABINFO $SQLGETTABINFO.bak [ -f $SQLCREATEINDEXLOG ] && mv $SQLCREATEINDEXLOG $SQLCREATEINDEXLOG.bak [ -f $SQLGETTABINFOLOG ] && mv $SQLGETTABINFOLOG $SQLGETTABINFOLOG.bak #Uebergebene Felder aufbereiten FELDER=$(echo "\"$(echo $FELDER | sed s/,/\",\"/g)\"") #Beschreibung fuer die Tabelle auslesen echo "\nLade Tabellenbeschreibung fuer Tabelle ${SCHEMA}.\"${TABELLE}\" :" echo "set echo off;" | tee -a $SQLGETTABINFO echo "set termout off;" | tee -a $SQLGETTABINFO echo "spool $SQLGETTABINFOLOG" | tee -a $SQLGETTABINFO echo "whenever sqlerror exit sql.sqlcode" | tee -a $SQLGETTABINFO echo "connect / as sysdba;" | tee -a $SQLGETTABINFO echo "desc ${SCHEMA}.\"${TABELLE}\";" | tee -a $SQLGETTABINFO echo "exit;" | tee -a $SQLGETTABINFO #Attribute der Erstellten SQL Script Datei ausgeben ls -al $SQLGETTABINFO #SQL Script rudimentaer auf Inhalt pruefen und ausfuehren [ "$(cat ${SQLGETTABINFO} | wc -l)" -lt $ZEILEN ] && echo "\n**** Die Ausfuehrung wird nicht vorgenommen.\nDas SQL Script hat weniger als $ZEILEN Zeilen.\nAbbruch." && exit 0 sqlplus /NOLOG @${SQLGETTABINFO} RC=$? [ "$RC" -eq 0 ] && echo "\nDie Tabellenbeschreibungi fuer ${SCHEMA}.\"${TABELLE}\" wurde erfolgreich geladen" [ "$RC" -ne 0 ] && echo "*** Fehler: sqlplus wurde mit Fehlern beendet.\nDie Tabellenbeschreibung konnte nicht geladen werden\nBitte pruefen!\niGGf. existiert die Tabelle ${SCHEMA}.\"${TABELLE}\" nicht.\n$(cat $SQLGETTABINFOLOG)" && exit 1 #Uebergebene Felder pruefen ob diese auch in der Tabelle existieren. echo "\nPruefe die angegebenen Felder auf Existenz:" for i in $(echo "${FELDER}" | sed s/','/' '/g | sed s/'"'//g ) do grep $i $SQLGETTABINFOLOG >/dev/null SUCHRC=$? [ "$SUCHRC" -ne 0 ] && echo "\n**** Das Feld $i konnte in der Tabelle ${SCHEMA}.\"${TABELLE}\" nicht gefundden werden! ****\nDer Index kann nicht erstellt werden. Das Script wird abgebrochen!" && exit 1 [ "$SUCHRC" -eq 0 ] && echo "Feld: $i gefunden" done #Script fuer die Index Erstellung zusammen setzen echo "\nErstelle Indizies fuer Tabelle ${SCHEMA}.\"${TABELLE}\" :" #Informationen zu der Tabelle und den Feldern als Kommentar in das Script schreiben um die Informationen fuer eine Scriptmodifikation direkt im Editor zu sehen. echo "-- Die Tabelle mit den Vorhandenen Feldern:" | tee -a $SQLCREATEINDEX grep -v "Connected." $SQLGETTABINFOLOG | sed 's/^/-- /' | tee -a $SQLCREATEINDEX echo "set echo off;" | tee -a $SQLCREATEINDEX echo "set termout off;" | tee -a $SQLCREATEINDEX echo "spool $SQLCREATEINDEXLOG" | tee -a $SQLCREATEINDEX echo "whenever sqlerror exit sql.sqlcode" | tee -a $SQLCREATEINDEX echo "connect / as sysdba;" | tee -a $SQLCREATEINDEX echo "CREATE Index ${SCHEMA}.\"${TABELLE}~BDLS\" on ${SCHEMA}.\"${TABELLE}\" (${FELDER}) NOLOGGING TABLESPACE P${SCHEMA} PARALLEL;" | tee -a $SQLCREATEINDEX echo "ALTER INDEX ${SCHEMA}.\"${TABELLE}~BDLS\" NOPARALLEL;" | tee -a $SQLCREATEINDEX echo "ANALYZE INDEX ${SCHEMA}.\"${TABELLE}~BDLS\" ESTIMATE STATISTICS SAMPLE ${PROZENT} PERCENT;" | tee -a $SQLCREATEINDEX echo "exit;" | tee -a $SQLCREATEINDEX #Attribute der Erstellten SQL Script Datei ausgeben ls -al $SQLCREATEINDEX #Anpassung des erstellten SQL Scriptes ermöglichen echo "\n... Datei kann jetzt editiert werden.\nDer Inhalt wird im Anschluss ausgefuehrt\nWenn nicht gewuenscht Dateiinhalt komplett loeschen!" sleep 3 vi $SQLCREATEINDEX #Pruefen ob der Inhalt des SQL Scripts geloescht worden ist (dann nicht ausfuehren) ansonsten ausfuehren und Returncode abfragen [ "$(cat ${SQLCREATEINDEX} | wc -l)" -lt $ZEILEN ] && echo "\n**** Die Ausfuehrung wird nicht vorgenommen.\nDas SQL Script hat weniger als $ZEILEN Zeilen.\nAbbruch." && exit 0 sqlplus /NOLOG @${SQLCREATEINDEX} RC=$? [ "$RC" -eq 0 ] && echo "\nOK: sqlplus wurde erfolgreich ausgefuehrt:\n$(cat $SQLCREATEINDEXLOG)" [ "$RC" -ne 0 ] && echo "\n*** Fehler: sqlplus wurde mit Fehlern beendet.\nBitte pruefen!\n$(cat $SQLCREATEINDEXLOG)" && exit 1 #Das Script wird sauber beendet. Bei Fehlern setzen vorherige Exits entsprechende Returncodes exit 0