Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

Ähnliche Dokumente
Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

PRÜFUNG AUS DATENBANKSYSTEME VU Kennnr. Matrikelnr. Familienname Vorname

PRÜFUNG AUS DATENBANKSYSTEME VU Kennnr. Matrikelnr. Familienname Vorname

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Dr. Thomas Neumann

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

DB I S. 1 Referentielle Aktionen [10 P.] Gegeben sei folgende Datendefinition:

Übungen zu Datenbanksysteme

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

PRÜFUNG AUS DATENBANKSYSTEME VU Kennnr. Matrikelnr. Familienname Vorname

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Grundlagen von Datenbanken. Referentielle Aktionen, Sichten, Serialisierbarkeit und Locking

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Dr. Thomas Neumann

Übung PL/SQL Trigger Lösungen

Schnellübersichten. SQL Grundlagen und Datenbankdesign

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

PRÜFUNG AUS DATENBANKSYSTEME VL Kennnr. Matrikelnr. Familienname Vorname

Grundlagen der Informatik

PRÜFUNG AUS DATENBANKSYSTEME VU Kennnr. Matrikelnr. Familienname Vorname

Hochschule Karlsruhe Technik und Wirtschaft Fakultät für Informatik und Wirtschaftsinformatik

Datenbanksysteme 2013

1 Referentielle Aktionen

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Die InnoDB Storage Engine. Handy aus?

1 Hartmann Anna Cäcilienstr Köln (0221) Behrens-Hoffmeister Heidi Lindenweg Köln (0221)

Oracle 10g Einführung

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Datenbanksysteme 2009

Übung 14. Tutorübung zu Grundlagen Datenbanken (Gruppen DO-T24 / DO-T31 WS 2016/2017)

Dieser Foliensatz darf frei verwendet werden unter der Bedingung, dass diese Titelfolie nicht entfernt wird.

NoSQL mit Postgres 15. Juni 2015

PRÜFUNG AUS DATENBANKSYSTEME VU Kennnr. Matrikelnr. Familienname Vorname

Datenbanksysteme I WS 18/19 Teillösung Übungsblatt 4-6

3 Query Language (QL) Einfachste Abfrage Ordnen Gruppieren... 7

DB-Datenbanksysteme. DB SQL-DML 1 Mario Neugebauer

PostgreSQL Ein Überblick

Praktische SQL-Befehle 2

Übungsblatt 8- Lösungsvorschlag

Logging und Debugging. Gerd Volberg OPITZ CONSULTING Deutschland GmbH

Dipl. Inf. Eric Winter. PostgreSQLals HugeData Storage Ein Erfahrungsbericht

Induktionsschluss: Sei Q RA eine Anfrage der Relationenalgebra mit n > 0 Operatoren.

5.8 Bibliotheken für PostgreSQL

Die Anweisung create table

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Grundlagen von SQL. Informatik 2, FS18. Dr. Hermann Lehner (Material von Dr. Markus Dahinden) Departement Informatik, ETH Zürich

5/14/18. Grundlagen von SQL. Grundlagen von SQL. Google, Facebook und Co. setzen auf SQL. Whatsapp

Praktische SQL-Befehle

Oracle Database 12c Was Sie immer schon über Indexe wissen wollten

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II SS Transaktionen & ACID. Dr. Christian Senger Transaktionen & ACID 1

Oracle native json Support. Erste Schritte

6. Updates in SQL 6-1. Inhalt. 1. Update-Kommandos in SQL. 2. Transaktionen. 3. Gleichzeitige Zugriffe

SQL. Allgemeines CREATE TABLE DROP TABLE ALTER TABLE INSERT INTO UPADTE DELETE SELECT

Fehlerbehandlung (Recov

Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

SQL structured query language

Semesterklausur. Hinweise:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

Klausur PI Datenbanken II vom Name: Praktische Informatik (Krägeloh)

Übung ERM. Beispiel: Erstellung einer relationalen Datenbank

Übung Datenbanksysteme Updates, Integritätsbedingungen, funktionale Abhängigkeiten

Beispiel zur referentiellen Integrität

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

SQL-Vertiefung. VL Datenbanksysteme. Ingo Feinerer

Datenbank und Tabelle mit SQL erstellen

Seminar 2. SQL - DML(Data Manipulation Language) und. DDL(Data Definition Language) Befehle.

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Klausur Datenbanksysteme, Lösungen

Funktion definieren Gibt Summe der Gehälter zurück. Aufruf in einem SQL-Statement

Installation MySQL Replikationsserver

Lösung zu Aufgabe 6. Lösung:

Datenbanken. Zusammenfassung. Datenbanksysteme

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Übersicht der wichtigsten MySQL-Befehle

Gruppe B Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit.

3.6 Transaktionsverwaltung

Prozedurale Datenbank- Anwendungsprogrammierung

Datenbanken: Transaktionskonzept und Concurrency Control

4.14 Integrität und Trigger

Fehlerbehandlung (Recovery)

Anwendungsentwicklung Datenbanken SQL. Stefan Goebel

OLTP von der Echtzeitdatenerfassung bis zur Auswertung. TecWare Gesellschaft für Softwareentwicklung mbh

SQL-Programmteile in der Vorlesung. SQL-Vertiefung. Definition von Constraints. Constraint Typen

Transkript:

Gruppe A Bitte tragen Sie SOFORT und LESERLICH Namen und Matrikelnr. ein, und legen Sie Ihren Studentenausweis bereit. PRÜFUNG AUS MUSTERLÖSUNG 30.01.2018 DATENMODELLIERUNG 2 (184.790) DATENBANKSYSTEME (184.686) GRUPPE A Matrikelnr. Familienname Vorname Arbeitszeit: 60 Minuten. Lösen Sie die Aufgaben auf den vorgesehenen Blättern; Lösungen auf Zusatzblättern werden nicht gewertet. Viel Erfolg! Aufgabe 1: Eigenschaften von Transaktionen (7) Betrachten Sie die unten angegebene Historie, welche durch eine Abfolge von Elementaroperationen der vier Transaktionen T 1, T 2, T 3 und T 4 auf den Datensätzen A, B, C und D gegeben ist. Dabei bedeutet r i (X) dass Transaktion T i den Datensatz X liest (read), w i (X) dass Transaktion T i den Datensatz X schreibt (write), und c i steht für das commit der Transaktion T i. r 2 (A), r 4 (A), r 2 (C), w 2 (C), w 2 (D), r 3 (D), w 1 (A), w 3 (B), r 1 (C), r 2 (D), r 4 (B), r 1 (A), c 2, c 3, c 4, c 1 a) Zeichnen Sie den Serialisierbarkeitsgraphen der oben angegeben Historie. (a) Serialisierbarkeitsgraph: T 2 T 1 T 3 T 4 b) Ist die Historie aus (a) konfliktserialisierbar? ja nein Wenn ja, geben Sie bitte eine mögliche Reihenfolge an. Wenn nein: welche Transaktion(en) müssten entfernt werden, damit die verbleibende Historie konfliktserialisierbar wird? (Achtung: Nur ankreuzen ohne einer Antwort auf den zweiten Teil gibt keinen Punkt!) T 2... vor T 3... vor T 4... vor T 1...

Aufgabe 2: Logging & Recovery (14) Sie finden nach einem Crash Ihrer Datenbank (mit Verlust des Datenbankpuffers jedoch nicht des Hintergrundspeichers) die folgenden Log-Einträge vor. Im Hintergrundspeicher befinden sich die unten angegebenen Seiten. Für normale Logeinträge wird das Format [LSN, TA, PageID, Redo, Undo, PrevLSN] verwendet, und für Kompensations Logeinträge (Compensation Log Records) wird das Format LSN, TA, PageID, Redo, UndoNextLSN, PrevLSN verwendet. BOT Log-Einträge verwenden das Format [LSN, TA, BOT, PrevLSN], und COMMIT Einträge das Format [LSN, TA, COMMIT, PrevLSN]. Beachten Sie, dass Undo/Redo-Einträge relativ zum Datenbestand mittels Addition bzw. Subtraktion angegeben werden, z.b.: [#i, T j, P X, X+=d 1, X-=d 2, #k] bedeutet, dass laut i-tem Eintrag die Transaktion T j auf ein Datum X auf der Seite P X schreibend zugreift, so dass beim Redo X um d 1 vergrößert werden müsste und beim Undo um d 2 verkleinert werden müsste und der vorangegangene Logeintrag dieser Transaktion die Nummer k hat. Log-Einträge Seiten im Hintergrundspeicher [#1, T 3, BOT, 0] [#2, T 1, BOT, 0] [#3, T 2, BOT, 0] [#4, T 1, P A, A-=50, A+=50, #2] [#5, T 2, P A, A+=0, A-=0, #3] [#6, T 3, P C, C+=25, C-=25, #1] [#7, T 2, P B, B+=50, B-=50, #5] [#8, T 1, P C, C+=25, C-=25, #4] [#9, T 3, P B, B-=75, B+=75, #6] [#10, T 2, P C, C+=25, C-=25, #7] [#11, T 3, COMMIT, #9] #12, T 2, P C, C-=25, #7, #10 P A LSN: #4 A = 25 P B LSN: #0 B = 120 P C LSN: #8 C = 60 a) Bestimmen Sie die Werte für A, B und C nach der Redo-Phase. A: 25............. B : 95............. C : 60............. b) Führen Sie die Undo-Phase aus. Erzeugen Sie die Compensation Log Records (CLRs), und geben Sie die Werte für A, B und C nach Beendigung der Undo-Phase an. Schreiben Sie die CLRs auf die untenstehenden Zeilen; es kann sein, dass Sie nicht alle Zeilen benötigen. Verwenden Sie das oben beschriebene Format. #13, T 1, P C, C-=25, #4, #8......... #17, T 2, BOT, #0, #15................. #14, T 2, P B, B-=50, #5, #12........ #18, T 1, BOT, #0, #16................. #15, T 2, P A, A-=0, #3, #14...................................................... #16, T 1, P A, A+=50, #2, #13..................................................... A: 75............. B : 45............. C : 35.............

Aufgabe 3: Locking/Sperrprotokolle (14) (a) Gegeben ist die untenstehende Folge von Sperranforderungen und Freigaben von Sperren. Dabei bedeutet locks i(o) (bzw. lockx i (O) ), dass die Transaktion T i eine Lesesperre (bzw. eine Schreibsperre) auf das Datenobjekt O anfordert. Hingegen bedeutet unlocks i (O) (bzw. unlockx i (O) ), dass die Transaktion eine gehaltene Lesesperre (bzw. eine Schreibsperre) auf das Datenobjekt O freigibt. locks 2 (B), lockx 4 (D), locks 1 (B), lockx 3 (A), unlockx 4 (D), locks 3 (C), lockx 4 (C)( ), locks 4 (B), lockx 2 (D), unlocks 1 (B), lockx 1 (A), unlockx 2 (D), unlockx 1 (A), locks 2 (A)( ) Solange eine Transaktion blockiert ist (also eine Sperre angefordert aber noch nicht erhalten hat), überspringen Sie bitte Sperranforderungen bzw. Freigaben von Sperren dieser Transaktion (die Transaktion ist ja inaktiv). Wenn eine Transaktion nach einer Blockierung weiterlaufen kann, betrachten Sie bitte zuerst die übersprungenen Einträge dieser Transaktion, bis die Transaktion entweder wieder blockiert, oder bis alle übersprungenen Anfragen abgearbeitet wurden. a) Welche der vier Transaktionen T 1, T 2, T 3 und T 4 verletzt das 2-Phasen Sperrprotokoll? Begründen Sie kurz Ihre Antwort. Die folgenden Transaktionen verletzen das 2-Phasen Sperrprotokoll: T 1, T 2, T 4... Begründung: Diese drei Transaktionen fordern eine Sperre an.................... nachdem sie bereits eine Sperre freigegeben haben................................... b) Skizzieren Sie bitte im ersten (linken) unten angegebenen Kästchen die Situation an der mit ( ) gekennzeichneten Stelle in der Folge, indem Sie die vorgegebene Tabelle vervollständigen. Tragen Sie in ein Feld ein X (bzw. ein S) ein, wenn die entsprechende Transaktion eine Schreibsperre (bzw. eine Lesesperre) auf dieses Datenobjekt besitzt. Tragen Sie für blockierte Transaktionen bitte zusätzlich für jene Sperranforderung auf Grund welcher die Transaktion nun blockiert ist (also jene, welche nicht gewährt wurde) ein WS (wait shared) bzw. WX (wait exclusive) in das entsprechende Feld ein. c) Zeichnen Sie in das zweite (rechte) unten angegebene Feld den Wartegraphen für diese Transaktionen zum Zeitpunkt ( ). (b) Aktuelle Sperren: (c) Wartegraph: A B C D T 2 T 1 S T 2 S T 1 T 3 T 3 X S T 4 WX T 4 d) Herrscht zum Zeitpunkt ( ) ein Deadlock? ja nein Falls ja, geben Sie bitte an, welche Transaktion(en) abgebrochen werden müssten um den Deadlock aufzulösen. Falls nicht, geben Sie eine zusätzliche Sperranforderung einer zum Zeitpunkt ( ) nicht blockierten Transaktion an, welche zum Zeitpunkt ( ) als nächste Anforderung sofort zu einem Deadlock führen würde. (Achtung, ankreuzen alleine ohne eine Antwort auf den zweiten Teil gibt keine Punkte!) lockx 3 (B)...............................................

Für die Aufgaben 4 6 gilt die Datenbankbeschreibung am letzten Blatt dieser Prüfung. Aufgabe 4: Create Statements (11) Die Tabelle trainer wurde bereits angelegt. CREATE TABLE trainer( id INTEGER PRIMARY KEY, name VARCHAR(20) NOT NULL, buddy INTEGER, candies INTEGER ); Geben Sie nun Create-Statements mit allen entsprechenden Constraints für die Tabellen pokemon und caught an. Die Spalte evolution candy in pokemon hat als Standardwert 0. Schreiben Sie zusätzlich ein Statement, das die Tabelle trainer so ändert, dass der Fremdschlüssel der Spalte buddy richtig abgebildet wird. Wählen Sie entsprechende Datentypen (Integer, Varchar) für die Attribute. CREATE TABLE pokemon( id INTEGER PRIMARY KEY, name VARCHAR(20) NOT NULL, evolution_from INTEGER REFERENCES pokemon(id), evolution_candy INTEGER DEFAULT 0 ); CREATE TABLE caught( tid INTEGER REFERENCES trainer(id), pid INTEGER REFERENCES pokemon(id), cnt INTEGER, PRIMARY KEY(tid,pid) ); ALTER TABLE trainer ADD CONSTRAINT fk_buddy FOREIGN KEY (buddy) REFERENCES pokemon(id);

Aufgabe 5: Rekursive Abfragen (15) Geben Sie ein select-statement (ohne WITH RECURSIVE) an, das zweistufige Entwicklungen ausgibt. Für die Beispielinstanz soll z.b. folgende Tabelle ausgegeben werden: id evolution from candy 76 74 125 95 807 37 208 808 62 Es kann zum Beispiel das Pokémon mit der id 76 mit Hilfe von 125 Candies aus dem Pokémon mit der id 74 entwickelt werden (aus 74 wird mit 25 Candies Pokémon 75 und aus 75 wird mit 100 Candies Pokémon 76). SELECT p1.id, p2.evolution_from, p1.evolution_candy + p2.evolution_candy AS candy FROM pokemon p1 JOIN pokemon p2 ON p1.evolution_from = p2.id WHERE p2.evolution_from IS NOT NULL; Geben Sie nun eine rekursive Abfrage an, die alle möglichen Entwicklungen samt der Anzahl der benötigten Candies ausgibt. WITH RECURSIVE evolutions(id,ev_from,ev_candy) AS ( SELECT id, evolution_from, evolution_candy FROM pokemon WHERE evolution_from IS NOT NULL UNION SELECT e.id, p.evolution_from, e.ev_candy + p.evolution_candy FROM pokemon p JOIN evolutions e ON p.id = e.ev_from WHERE p.evolution_from IS NOT NULL ) SELECT * FROM evolutions;

Aufgabe 6: PL/SQL Trigger (9) Nehmen Sie an, dass die Funktion und der Trigger wie am letzten Blatt dieser Prüfung definiert wurde. Es wird nun folgendes Update-Statement über die Beispielinstanz ausgeführt. Geben Sie die Ausgabe der Select- Statements für die Tabelle trainer und caught an. UPDATE caught SET pid = 75 WHERE tid = 1 AND pid = 74; SELECT * FROM trainer WHERE id = 1; SELECT * FROM caught WHERE tid = 1; trainer caught id name buddy candies tid pid cnt 1 Rocko 95 25 1 75 1 1 95 1 Über die geänderte Instanz wird nun folgendes Update-Statement ausgeführt. Geben Sie die Ausgabe der Select- Statements für die Tabelle trainer und caught an. UPDATE caught SET pid = 208 WHERE tid = 1 AND pid = 95; SELECT * FROM trainer WHERE id = 1; SELECT * FROM caught WHERE tid = 1; trainer caught id name buddy candies tid pid cnt 1 Rocko 95 25 1 75 1 1 95 1 Über die geänderte Instanz wird nun folgendes Update-Statement ausgeführt. Geben Sie die Ausgabe der Select- Statements für die Tabelle trainer und caught an. UPDATE caught SET pid = 121 WHERE tid = 2 AND pid = 120; SELECT * FROM trainer WHERE id = 2; SELECT * FROM caught WHERE tid = 2; trainer caught id name buddy candies tid pid cnt 2 Misty 120 950 2 120 1 2 121 1 Gesamtpunkte: 70

Sie können diese Seite abtrennen und brauchen ihn nicht abgeben! Diesen Zettel daher bitte nicht beschriften! (Lösungen auf diesem Zettel werden nicht gewertet!) Die folgende Datenbankbeschreibung gilt für die Aufgaben 4 6: Gegeben ist folgendes stark vereinfachtes Datenbankschema zum Speichern von Pokémon und Trainern, die Pokémon sammeln. trainer(id, name, buddy: pokemon.id, candies) pokemon(id, name, evolution from: pokemon.id, evolution candy) caught(tid: trainer.id, pid: pokemon.id, cnt) Auf der Rückseite finden Sie eine Beispielinstanz dieses Schemas! Jeder Trainer trainer hat eine eindeutige Identifikationsnummer id und einen Namen name. Weiters, verweist buddy auf das aktuelle Buddy-Pokémon und candies speichert die Anzahl der gesammelten Candies. Jedes Pokémon pokemon hat eine eindeutige Identifikationsnummer id und einen Namen name. Außerdem kann ein Pokémon aus einem anderen Pokémon entwickelt werden. Dazu wird die id des Pokémons in evolution from gespeichert aus dem das Pokémon entwickelt werden kann und die Anzahl der Candies evolution candy die für die Entwicklung notwendig sind. Die Anzahl der gefangenen Pokémon pro Trainer wird in der Tabelle caught gespeichert. Hinweis: Nicht alle Pokémon in der Beispielinstanz kommen auch im Spiel vor ;).

Beispielinstanz für Aufgabe 4 6: pokemon id name evolution from evolution candy 74 Kleinstein NULL 0 75 Georock 74 25 76 Geowaz 75 100 95 Onix 808 12 120 Sterndu NULL 0 121 Starmie 120 50 208 Stahlos 95 50 807 Munix NULL 0 808 Minix 807 25 trainer id name buddy candies 1 Rocko 95 50 2 Misty 120 1000 caught tid pid cnt 1 74 1 1 95 1 2 120 2 Trigger für Aufgabe 6: CREATE OR REPLACE FUNCTION fa() RETURNS TRIGGER AS $$ DECLARE v_c INTEGER; BEGIN SELECT evolution_candy INTO v_c FROM pokemon WHERE id = NEW.pid AND evolution_from = OLD.pid; IF v_c IS NOT NULL THEN IF EXISTS(SELECT id FROM trainer WHERE id = NEW.tid AND candies > v_c) THEN IF (NEW.cnt>1) THEN IF EXISTS(SELECT * FROM caught WHERE tid = NEW.tid AND pid = NEW.pid) THEN UPDATE caught SET cnt = cnt + 1 WHERE tid = NEW.tid AND pid = NEW.pid; ELSE INSERT INTO caught VALUES (NEW.tid,NEW.pid,1); END IF; NEW.pid := OLD.pid; NEW.cnt := OLD.cnt - 1; END IF; UPDATE trainer SET candies = candies - v_c WHERE id = NEW.tid; ELSE RETURN NULL; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER tra BEFORE UPDATE ON caught FOR EACH ROW EXECUTE PROCEDURE fa();