\documentclass{article}
\usepackage[final]{pdfpages}
\usepackage{listings}
\usepackage{graphicx}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}

\newcommand{\solution}[1]{\ifdefined\withsolutions #1 \fi}
\newcommand{\solswitch}[2]{\ifdefined\withsolutions #2 \else #1 \fi}
\newcommand{\s}[1]{\solution{ \textit{#1} }}
%use like \solution{ $SOLUTION }
\begin{document}

\section*{Disclaimerino}
\subsection*{What's this}
Dies ist eine studentische, prüfungsschwierigkeit immitierende Aufgabenzusammenfassung die Themen der Vorlesung IDB. Es handelt sich insbesondere nicht um einen sogenannten "Braindump". Die Aufgaben orientieren sich an den Aufgaben in der ursprünglichen Klausur insofern, dass hier zum Beipsiel anstatt der Frage 'Sind Kühe Lila?' die Frage 'Machen Kuehe Schokolade?' steht. Auf beide Fragen ist die Antwort: Nein, du schaust zuviel Milkawerbung.

\subsection*{Allgemeiner Sicherheitshinweis}
Vorsicht ist die Mutter der Porzellankiste bei dieser Klausur, auch im WS1617 (der Nachfolgeklausur von dieser hier) kam mit R-Bäumen z.B. ein voellig neuer Aufgabentyp in die Klausur. Es ist naheliegen, dass dies auch in Zukunft passieren wird. Ausserdem koennen hier natuerlich selbstverstaendlich Fehler enthalten sein.

\subsection*{Anything else?}
Schaut auf meinem gitlab vorbei wenn ihr dieses Dokument verbessern wollte, Pullrequest werden gerne gesehen. \textit{gitlab.cs.fau.de/ik15ydit/latexandmore} Außerdem bedanke ich mich beim Lehrstuhl fuer Datenbanksystem der Uni Erlangen fuer ihre Umfassenden Lernmaterialien und exzellente Literaturempfehlung, die die Erstellung von Loesung und Erarbeiten von alternativen Frage und Aufgabenstellungen so stark erleichtert haben. Falls ihr ueber diese Klausur diskutieren wollte koennt ihr dafuer das bereitsexistierende \textit{https://pad.stuve.fau.de/p/idb} verwenden.\\\\\\
\includegraphics[width=1\textwidth]{idb_done.png} %70% der Textbreite
\newpage
% ---------------------------- PAGEBREAK ----------------------------
\section*{Aufgabe 1 - Kunterbunte Schic *hicks* ten}
Begründe warum folgende Aussagen korrekt oder inkorret sind. Es gibt nur einen Punkt wenn Antwort UND Begruendung richtig sind.
\begin{itemize}
	\item \textbf{a)} Ein Sektor auf einem Speicherzylinder ist genau groß genug fuer einen Satz.
			\vspace{1cm}
            \solution{
                    Nein, die größe eines Sektors ist nicht definiert, er ist wahrscheinlich größer.
            }
            \vspace{1cm}
	\item \textbf{b)} Block- und Seitenabellen sind in den Speicherzuordnungstrukturen angesiedelt.\\
            \vspace{1cm}
            \solution{
                    Nein, bei den Seitenzuordnungsstrukturen.
            }
            \vspace{1cm}
	\item \textbf{c)} Blöcke müssen nur bei direkter Seitenzuordnung gleich groß sein.\\
            \vspace{1cm}
            \solution{
                    Nein, theoretisch könnten mit entsprechenden Verwaltungsoverhead verschieden große Blöcke verwendet werden.
            }
            \vspace{1cm}            
	\item \textbf{d)} Die Seitenersetzungsstrategie LFU (Least frequently used) hat den Vorteil, dass sich der Puffer schnell an neue Datenlokalitaeten anpasst.\\
            \vspace{1cm}            
            \solution{
             Nein, denn die Puffereffizients kann dadurch beeintraechtigt werden, dass es
sehr lange dauert bis eine, zeitweise stark aber dann ie wieder genutzte
Seite aus dem Puffer verdraengt wird.
            }
            \vspace{1cm}            
	\item \textbf{e)} Eine Seite im Datenbankpuffer muss irgendwann auf die Platte zurueckgeschrieben werden..\\
            \vspace{1cm}            
            \solution{
                    Nein, mitunter wurde sie nicht veraendert oder es gibt andere Gruende warum man sie nicht auf die Platte schreiben moechte (rollback aus hoeherer Ebene?).
            }
            \vspace{1cm}            
	\item \textbf{f)} Bei der Verlaengerung eines Satzes kann es vorkommen, dass sich dessen TID aendert.\\
            \vspace{1cm}            
            \solution{
                Nein, denn die TID wird mitunter bereits woanders verwendet und darf deshalb nichtmehr geaendert werden.
            }
            \vspace{1cm}            
	\item \textbf{g)} Ein Zugriff ueber einen Index ist immer schneller als ein Table-Scan. \\
            \vspace{1cm}            
            \solution{
                Nein, bei genau einem Eintrag nicht.
            }
            \vspace{1cm}            
	\item \textbf{h)} Ein Schluessel in einem Index, darf nicht nicht von fester Laenge sein verwendet werden. [Das - nicht nicht - ist beabsichtigt]\\
            \vspace{1cm}            
            \solution{
                    Nein, (also doch) denn es gibt Indexstrukturen die das ermoeglichen.
            }
            \vspace{1cm}            
	\item \textbf{i)} Die Hashtabelle beim Linearen Hashing, wird, wenn sie vergroessert wird, jedes mal um den einen festen Wert n erhoeht.\\
            \vspace{1cm}            
            \solution{
                Nein, sie wird jedes mal um eins erhoeht.
            }
            \vspace{1cm}            
	\item \textbf{j)} Wenn in einem B*-Baum Werte gesucht werden, muss immer bis zu einem Knoten ohne Kind abgestiegen werden.\\
            \vspace{1cm}            
            \solution{
                Nein, denn nur in den Blattknoten werden Daten gespeichert.
            }
            \vspace{1cm}            
	\item \textbf{k)} Ein B-Baum kann keine variablen Daten enthalten.\\
            \vspace{1cm}            
            \solution{
                Nein, ein B-Baum kann im Allgemeinen beliebige Daten und Datenmengen enthalten, also auch Saetze.
            }
            \vspace{1cm}            
	\item \textbf{l)} In einem R-Baum kann es vorkommen, dass wir auf der Suche nach einen Wert mehrere Blattknoten betrachten muessen. \\
            \vspace{1cm}            
            \solution{
                Nein, R-Baume sind Suchbaeume, daher wissen wir immer in welchen Ast wir absteigen muessen, und es kann nicht sein, dass wir uns mehrere Blaetter auf der Suche nach einem Wert anschauen muessen.
            }
            \vspace{1cm}            
	\item \textbf{m)} Sichten beschleunigen die Aussfuehrung von Anfragen.\\
            \vspace{1cm}            
            \solution{
                Nein, nur materialisierte Sichten die tatsaechlich im Speicher liegen.
            }
            \vspace{1cm}            
	\item \textbf{n)} In den ACID-Eigenschaften einer Transaktionen steht das A fuer Authencity.\\
            \vspace{1cm}            
            \solution{
                Nein, fuer Atomacy.
        }
            \vspace{1cm}            
	\item \textbf{o)} Bei Forward-Recovery darf kein 'steal' stattfinden.\\
            \vspace{1cm}            
            \solution{
                Ja, steal beudetet, dass Dinge aus dem Puffer vor Ende der Transaktion zurueckgeschrieben werden, damit haette man evt. einen Inkonsitenten Zustand auf der Platte den man nicht rueckgaengig machen kann weil man Forward-Recovery hat.
            }
\end{itemize}

\newpage
% ---------------------------- PAGEBREAK ----------------------------

\section*{Aufgabe 2 Ich weiss wo deine TID wohnt}
\subsection{a)}
Deine Mutter hat \textbf{Clock} als Seitenersetzungsstrategie verwendet und kapiert jetzt ihren eigenen Code nicht mehr, deswegen musst du die Seitenersetzungsstrategie jetzt unten nachbauen. Du hast 3 Plaetze in deinem Haupspeicher, die haben jeweils einen Kontrollzustand (also auch 3 insgesamt) unten ist dann noch dein Pointer bei welchem Platz du gerade bist. GoGoGo!!!\\\\

\hspace{2cm}
\solswitch{
\begin{tabular}{|r|r|r|r|r|r|r|}\hline
Input 			& ...	& 4 &  7	& 2 	& 1 	& 5		\\\hline
				&		& 	& 		& 		&		&		\\
Hauptspeicher 	&		& 	& 		& 		&		&		\\\hline
Speicherplatz A & ...	& 4	& 		& 		& 		& 		\\\hline
Speicherplatz B & ...	& 1	& 		& 		& 		& 		\\\hline
Speicherplatz C & ...	& 9	& 		& 		& 		& 		\\\hline
				&		& 	& 		& 		&		&		\\
Kontrollzustaende &		& 	& 		& 		&		&		\\\hline
Platz A 		& ...	& 1	& 		& 		& 		& 		\\\hline
Platz B 		& ...	& 1	& 		& 		& 		& 		\\\hline
Platz C 		& ...	& 1	& 		& 		& 		& 		\\\hline
Cur. Pointer 	& ...	& C	& 		& 		&		&	\\\hline
\end{tabular} 
}{
\begin{tabular}{|r|r|r|r|r|r|r|}\hline
Input 			& ...	& 4 &  7	& 2 	& 7 	& 5		\\\hline
				&		& 	& 		& 		&		&		\\
Hauptspeicher 	&		& 	& 		& 		&		&		\\\hline
Speicherplatz A & ...	& 4	& 4		& 2		& 2		& 2		\\\hline
Speicherplatz B & ...	& 1	& 1		& 1		& 1		& 5		\\\hline
Speicherplatz C & ...	& 9	& 7		& 7		& 7		& 7		\\\hline
				&		& 	& 		& 		&		&		\\
Kontrollzustaende &		& 	& 		& 		&		&		\\\hline
Platz A 		& ...	& 1	& 0		& 1		& 1		& 1		\\\hline
Platz B 		& ...	& 1	& 0		& 0		& 0		& 1		\\\hline
Platz C 		& ...	& 1	& 1		& 1		& 1		& 1		\\\hline
Cur. Pointer 	& ...	& C	& A		& B		& B		& C		\\\hline
\end{tabular} 
}
\vspace{1cm}
\subsection*{b)}
Gebe an welche Schnittstellen ein Datenbankpuffer \textbf{nach oben im Schichtenmodell} anbieten muss. (Welche Parameter, welche Rueckgabewerte und wozu sie dient.)

\solution{
\begin{tabular}{|l|l|l|l|}
\textbf{Funktion} & \textbf{Parameter} & \textbf{Rueckgabewert} & \textbf{Beschreibung} \\ \hline
fix  & Datei, BlockNo, Mode  & Pointer auf Seite & laed in Puffer, lockt fuer andere \\\hline
unfix & Pointer auf Seite im Puffer & void & gibt Block im Puffer fuer Ersetzung frei \\\hline
\end{tabular}
}

% ---------------------------- PAGEBREAK ----------------------------
\newpage

\section*{Aufgabe 3 TID-Adressierung}
TIDs nach Regeln aus der Vorlesung ergaenzen/eintragen und TID angeben.
Teilaufgaben sind unabhaengig. Buchstaben stehen fuer bereits vorhandene Saetze \\

\begin{itemize}
% a ------------------------------------------------------------------------------------ a%
	\item \textbf{a)} Fuegen einen Satz A mit Laenge 12 ein.\\  \\
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
F &  F &  F &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   & 0
\end{tabular}
\hspace{10mm}
%\textbf{Seite 2}
\solswitch{
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   & 0 
\end{tabular}
}{
\begin{tabular}{c|c|c|c}
x & x  & x  & x  \\\hline
x & x  & x  & x  \\\hline
x & x  & x  & x  \\\hline
 &   &   & 0 
\end{tabular}
}\hspace{10mm}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   & 0 
\end{tabular}\\\\
-\hspace{8mm} Seite 0 \hspace{2cm} Seite 1 \hspace{2cm} Seite 2 \hspace{2cm} -\\\\
\solswitch{ \textbf{Satz A: TID(\hspace{5mm},\hspace{5mm})} }{ { \textbf{Satz A: TID( 2 , 0 })} }
\vspace{1cm}



% b ------------------------------------------------------------------------------------ b%


	\item \textbf{b)} Ausgangsbelegung mit Saetzen F und X. Fuegen den Satz B, Laenge 14 ein.\\ \\
	\begin{tabular}{c|c|c|c}
F &  F & F  & F  \\\hline
F &  F & F  & F  \\\hline
F &  F & F  &   \\\hline
 &   &   & 0
\end{tabular}
\hspace{10mm}
\solswitch{
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
X & X  & X  & X \\\hline
X & X  & X  & X  \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}
%\textbf{Seite 2}
\hspace{10mm}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}\\\\
}{
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
F & F  & F  & F  \\\hline
F & F  & B &     \\\hline
 &   &   &   \\\hline
 &   & 5  & 0 
\end{tabular}
%\textbf{Seite 2}
\hspace{10mm}
\begin{tabular}{c|c|c|c}
TID & (1,1)  & B & B \\\hline
B& B & B & B \\\hline
B& B & B & B \\\hline
B& B & B &  0
\end{tabular}\\\\
}
- \hspace{8mm} Seite 0 \hspace{2cm} Seite 1 \hspace{2cm} Seite 2 \hspace{2cm} -\\\\ %dont ask and dont try yo remove the -
\solswitch{ \textbf{Satz A: TID(\hspace{5mm},\hspace{5mm})} }{ { \textbf{Satz A: TID( 1 , 1 })} }

% ---------------------------- PAGEBREAK ----------------------------
\newpage
% c ------------------------------------------------------------------------------------ c%

\newpage
	\item \textbf{c)} Die Satze F,C und X sind bereits vorhanden.\\ \\
	\textbf{Ausganszustand}\\\\
	\begin{tabular}{c|c|c|c}
F &  F & F  & F  \\\hline
F &  X & X  & X  \\\hline
X &  C & C  & C  \\\hline
 & 9  & 5  & 0
\end{tabular}
\hspace{10mm}
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}
%\textbf{Seite 2}
\hspace{10mm}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}\\\\
- \hspace{8mm} Seite 0 \hspace{2cm} Seite 1 \hspace{2cm} Seite 2 \hspace{2cm} -\\\\ %dont ask and dont try yo remove the -
Satz C@TID(0,2) auf Laenge 15.\\\\

\solswitch{
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   & 
\end{tabular}
\hspace{10mm}
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}
%\textbf{Seite 2}
\hspace{10mm}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}\\\\
}{
\begin{tabular}{c|c|c|c}
F & F  & F & F  \\\hline
F & X &  X & X  \\\hline
X & TID  &  (1,0) &   \\\hline
 & 9  & 5  & 0
\end{tabular}
\hspace{10mm}
%\textbf{Seite 1}
\begin{tabular}{c|c|c|c}
x & x  & x  & x  \\\hline
x & x  & x  & x  \\\hline
x & x  & x  & x  \\\hline
x & x  & x  & 0 
\end{tabular}
%\textbf{Seite 2}
\hspace{10mm}
\begin{tabular}{c|c|c|c}
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &   \\\hline
 &   &   &  
\end{tabular}\\\\
}
- \hspace{8mm} Seite 0 \hspace{2cm} Seite 1 \hspace{2cm} Seite 2 \hspace{2cm} -\\ %dont ask and dont try yo remove the -

\solswitch{ \textbf{Satz F: TID(\hspace{5mm},\hspace{5mm}), Satz X: TID(\hspace{5mm},\hspace{5mm}), Satz C: TID(\hspace{5mm},\hspace{5mm})} }{  \textbf{Satz F: TID( 0 , 0 ), Satz X: TID( 0 , 1 ), Satz C: TID( 0 , 2)} }

\end{itemize} 

% ---------------------------- PAGEBREAK ----------------------------
\newpage

\section*{Aufgabe 4 Indrexsstrukturen}
\subsubsection*{a) Erklaeren sie den Unterschied zwischen Primaer und Sekundaerorganisation im Bezug auf Datenspeicherung.}
\vspace{1cm}
\solution{Bei der Primaerorganisation werden die Daten tatsaechlich gespeichert, bei der Sekundaerorganisation werden sie nur referenziert, es kann also mehrere Sekundaerorganisationen ohne Datenredundanz geben.
}
\vspace{1cm}
\textbf{b)} Fuege in einen leeren \textbf{B*-Baum} mit $k_{inner}=2$ und $k_{leaf}=1$ die Tupel
\textbf{\hspace{1cm}(8,A)\hspace{1cm}(17,Z)\hspace{1cm}(1,U) \hspace{1cm}} in dieser Reihenfolge ein. Einzelschritte sind nicht noetig.\\\\
\begin{lstlisting}












.
\end{lstlisting}
\solution{
\lstinputlisting{tree1.ascii}
}
\textbf{c)} Loesche aus dem folgenden B-Baum den Schluessel 10. Zwischenschritte sind nicht noetig.\\\\
\solswitch{\lstinputlisting{tree2.ascii}}{
\textbf{Wenn mir das wer baut fueg ichs ein.}
}

% ---------------------------- PAGEBREAK ----------------------------
\newpage

\noindent \textbf{d)} Nennen sie vier Gruende, warum der folgende Baum kein korrekter \textbf{B-Baum} ist.\\
\solswitch{\lstinputlisting{tree3.ascii}\vspace{4cm}}{
	\begin{itemize}
		\item nicht balanciert
		\item 20 steht auf der falschen Seite, es haette oben bei 18 \textbf{rechts} eingetragen werden muessen
		\item es gibt kein $k_{inner}$ fuer das min/max in Knoten hinhaut
	\end{itemize}
}
\textbf{e)} Wir haben eine Tabelle in der wir Studenten verwalten wollen, darin gibt es folgende Attribute.\\\\
\textbf{Student(Geschlecht, Jahrgang, Dumm, FSI-Mitglied, Gehirngeschaedigt)}\\\\
Weil wir jetzt schnell die Korrelanz zwischen einer FSI-Mitgliedschaft und dem geistigen Zustand eines Studenten rausfinden wollen moechten wir einen Index ueber diese Attribute anlegen: \textbf{Dumm, FSI-Mitglied, Gehirngeschaedigt}. Welche Indexform eignet sich dafuer besonders gut?
\solution{Bitmap-Index}

% ---------------------------- PAGEBREAK ----------------------------
\newpage

\section*{Aufgabe 5 Transaktionen}

\subsection*{a) Was ist eine Real-World-Action im Datenbank Kontext}
\vspace{1cm}
\solution{ Eine in der Realen Welt stattfindende, nicht rueckgaenig machbare Aktion. (?)}
\vspace{1cm}

\subsection*{b) Welche Eigenschaften hat eine RWA die als Transaktion modeliert wurde wahrscheinlich gehabt?}
\solution{ Sie war wahrscheinlich pruefbar oder wiederholbar.}
\vspace{1cm}

\vspace{1cm}
\subsection*{c) Ablauf von Transaktionen}
rN(x) bedeutet, Transaktion N liest Element x. wN(x) bedeutet, Transaktion N schreiben Element x. Zeichne einen Abhaengigkeitsgraphen, es muss bei jeder Kante ersichtlich sein wie sie Zustande gekommen ist.
\begin{itemize}
	\item w3(c)
	\item r3(b)
	\item w3(a)
	\item w2(b)
	\item r1(a)
	\item r2(b)
	\item w3(b)
	\item r1(a)
	\item w1(b)
	\item r2(c)
\end{itemize}
% ---------------------------- PAGEBREAK ----------------------------
\newpage
\subsection*{d) Wann ist ein Ablauf serialisierbar?}
\vspace{1cm}
\solution{ Wenn kein Zyklus im Abhaengigkeitsgraphen. }
\vspace{1cm}
\subsection*{e) Gegeben ist der folgende Ablauf im Kontext einer fiktiven Lagerverwaltung: (repraesentativ in Java-like Syntax, alle Methoden des fiktiven Datenbank Frameworks scheissen eine "Failure"-Exception.)}
\begin{lstlisting}[language=java,tabsize=4]
class Failure extends Exception;
class Gegenstand{...};
while(true}{	
	try{
		startTransaction();
		setLocalCounterToZero();
		while(!terminatedByOperator()){
			Gegenstand g = queryInputFromOperator(); //RWA
			if(isInInventory(g)){
				incrementLocalCounter();
				decrementInventoryCountInDatabase();
			}else{
				displayErrorMessage();
				continue;
			}
		}
		writeNewEntryToDatabase(getUser(),getLocalCounter());
		commitTransaction(); //die Transaktion wird beendet
	}catch(Failure f)
		continue;
	}
}
\end{lstlisting}
\textbf{Erklaere welches Problem hier Problem hier auftreten kann und wie es zu loesen waere.}
\solution{
Während der Transaktion wird auf Eingabedaten von des Operators gewartet und währenddessen sind alle anderen Transaktionen auf die gleiche Datenbanktabelle blockiert. Es kann passieren, dass der Operator extrem lange mit der Eingabe braucht und derweil sind andere DB-Zugriffe blockiert. Die Loesung ist die  Transaktion kleiner zu machen und den lokalen counter irgendwie mit in die DB zu commiten sobald man etwas am Bestand aendert.
}
\newpage
% ---------------------------- PAGEBREAK ----------------------------
\subsubsection*{f) Inwiefern begrenzen Action-Consisten-Checkpoints Undo- und Redooperationen?}
\vspace{1cm}
\solution{
	TODO
}
\vspace{1cm}

\section*{Aufgabe 6 SQL und Mengen}
\subsubsection*{a) Operatorengraphen zu SQL-Kot unten. (muss nicht optimiert werden)}
\begin{lstlisting}[language=SQL]
SELECT *
FROM (
	SELECT X.b, X.e, Z.c
	FROM R JOIN S on R.k = S.k
	WHERE S.u = "Mimimi"
	UNION
	SELECT T.b, T.e, T.c
	FROM T
) X
WHERE X.b < 0;
\end{lstlisting}
\newpage
% ---------------------------- PAGEBREAK ----------------------------
\subsubsection*{b) Warum gilt folgendes nicht allgemein? (ein bis zwei Saetze, Gegenbeispiel reicht nicht)}
\begin{lstlisting}[language=SQL]
PROJ( A - B , X ) = PROJ( A , X) - PROJ( B , X)
\end{lstlisting}
\textit{'-' steht hier fuer die Differenz zweier Mengen}
\solswitch{\vspace{3cm}}{\vspace{1cm}Nein, denn es gehen bei der Projection Informationen verloren, die spaeter fuer die Differenz der Mengen einen Unterschied machen koennten. (Eine Tabelle mit drei Attributen die auf zwei Attribute reduziert/projeziert wurde und in der nur Zeilen gleich scheinen weil das unterscheidende dritte Attribut nicht mehr sichtbar/vorhanden ist.\vspace{1cm}}

\section*{Aufgabe 7 Programmschnittstelle}
\subsubsection*{a) Ist das folgende Programm anfaellig fuer SQL-Injections? Begruenden sie.}

\begin{lstlisting}[language=java,tabsize=4]
   public static void main(String[] args) {
   	Connection conn = null;
   	Statement stmt = null;
   	try{
   		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(DB_URL, USER, PASS);
		stmt = conn.createStatement();
		Scanner s = new Scanner();
	  	String tmp = s.readLine();
	  	String a = Integer(Integer.parseInt(tmp)).toString();
		sql = "INSERT INTO Trololololol VALUES(" + a + ")";
		stmt.executeUpdate(sql);
   	}
   }   
\end{lstlisting}
\solution{
Eher nicht, weil jede versuchte SQL Injection am Integer.parseInt() zerschellt. In der Klausur wars eine, aber ich wollte mal trollen. Man koennte auch argumentieren, dass das hier einen DOS-Angriff ermoeglichen koennte.
}
\vspace{2.5cm}
\textbf{b)} Wie kann man das obrige Program SICHER gegen SQL-Injections schuetzen?
\solution{
\begin{lstlisting}[language=java]
preparedStmt.setInt(1, a)
preparedStmt.execute();
\end{lstlisting}
Aber alleine die Aussage Prepared-Statements empfinde ich hier als wichtig.
}
\end{document}
