Übung PL/SQL Trigger Lösungen

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

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

Datenbanken SQL. Insert, Update, Delete, Drop. Krebs

Abfragen (Queries, Subqueries)

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

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

Die Datenmanipulationssprache SQL

SQL. Datenmanipulation. Datenmanipulationssprache. Ein neues Tupel hinzufügen. Das INSERT Statement

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS Metadaten

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

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

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

SQL structured query language

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

Übungsblatt 8- Lösungsvorschlag

5.8 Bibliotheken für PostgreSQL

Installation MySQL Replikationsserver

6. Datenintegrität. Integritätsbedingungen

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Kuriositäten in der Oracle-Datenbank

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

PostgreSQL unter Debian Linux

Datumsangaben, enthält mindestens Jahr, Monat, Tag

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

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

Powerful PL/SQL: Collections indizieren mit VARCHAR2- Indizes ein Praxisbeispiel

Cassandra Query Language (CQL)

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #5. SQL (Teil 3)

Kapitel DB:VI (Fortsetzung)

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

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

SQL-Anweisungen. SELECT (SQL Data Query Language)

Übung Datenbanken in der Praxis. Datenmodifikation mit SQL

SQL und MySQL. Kristian Köhntopp

Bibliografische Informationen digitalisiert durch

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

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Trigger schreiben. Überblick über Trigger. Datenbank Trigger: Beispiel. Aufbau eines Triggers

Semantische Integrität (auch: Konsistenz) der in einer Datenbank gespeicherten Daten als wichtige Anforderung

Universität Duisburg-Essen Informationssysteme Prof. Dr.-Ing. N. Fuhr. Praktikum Datenbanken / DB2 Woche 8: Trigger, SQL-PL

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #6. SQL (Teil 4)

Views in SQL. 2 Anlegen und Verwenden von Views 2

SQL and PL/SQL unleashed. Neuheiten bei Oracle 11g und Oracle 12c im Bereich SQL und PL/SQL

Fachhochschule Kaiserslautern Labor Datenbanken mit MySQL SS2006 Versuch 1

Editions - Upgrade im laufenden Betrieb

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort 13

MySQL. MySQL ist ein Datenbanksystem. Es besteht aus einem zentralen Server und aus (mehreren) Clients. Es benutzt einen Dialekt der Sprache SQL.

SQL-Vertiefung. VU Datenbanksysteme. Reinhard Pichler

CREATE TABLE-Syntax

Prozedurale Datenbank- Anwendungsprogrammierung

Datenbanken 1 und Objektorientierte Datenbanken

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS XMLType. Christian Senger/Andreas Schmidt XMLType 1/32

Objektrelationale, erweiterbare Datenbanken WS 04/05

Entwicklungsumgebung für die Laborübung

DB2 SQL, der Systemkatalog & Aktive Datenbanken

Speed up your Query Strategien zur Optimierung von SQL-Queries. Juni 2012 Ulrike Brenner

Fortgeschrittene SQL-Techniken für APEX-Formulare und Reports

MySQL 5.1. Kristian Köhntopp

NoSQL mit Postgres 15. Juni 2015

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel Michael Kluge (michael.kluge@tu-dresden.

Kapitel 3 Datenintegrität

105.3 SQL-Datenverwaltung

Inhalt. Ein Einführung in die Nutzung von SQL-Datenbanken am Beispiel Oracle. Daten und Tabellen - ein Beispiel. Daten und Tabellen - Normalisierung

Referentielle Integrität

Labor 3 - Datenbank mit MySQL

Fortgeschrittene SQL-Techniken für APEX-Formulare und -Reports

Von der passiven zur aktiven Datenbank. Checks und Assertions Referentielle Aktionen Trigger

Lösungen der Übungsaufgaben von Kapitel 10

ACCESS SQL ACCESS SQL

select DISTINCT Name, ort From Verkauf; selektiert Name und Ort von Tabelle Verkauf - DISTINCT steht dass keine Zeile mehrfach vorkommt

VO Datenmodellierung. Katrin Seyr

MNR NAME VORNAME STRASSE PLZ ORT TELEFON

SQL. SQL: Structured Query Language. Früherer Name: SEQUEL. Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99

Bedingungen über Werte Statische Integrität. CHECK-Klausel

Einstieg in das SQL- und Datenbanktuning Loblied auf den Tabellen-Index!

SQL-Befehlsliste. Vereinbarung über die Schreibweise

Datenbanksysteme. Dominic Pacher. Datenbanken und Informationssysteme (DBIS) Institut für Informatik Universität Innsbruck. dbis-informatik.uibk.ac.

Datenbanken: Datenintegrität.

SQL,Teil 1: CREATE, INSERT, UPDATE, DELETE, DROP

SQL (Structured Query Language) Schemata Datentypen

Advanced SQL verstehen und einsetzen SQL-Implementierungen kennen und bewerten

SQL: statische Integrität

Begleitskript. zum PHP/MySQL. Kurs

3.17 Zugriffskontrolle

IV. Datenbankmanagement

Struktur von PL/SQL. Oracle PL/SQL Die Programmiersprache von Oracle. Ein Beispiel. Bildschirmausgabe. Using Oracle PL/SQL.

Web-Technologien. Prof. Dr. rer. nat. Nane Kratzke SQL. Praktische Informatik und betriebliche Informationssysteme

Marcus Throll, Oliver Bartosch. Einstieg in SQL. Verstehen, einsetzen, nachschlagen. Galileo Press

Datenbanksysteme I. Klausur zum Praktikum. Mehrere Professoren prüfen mit genau einem Beisitzer genau einen Studenten.

Datenbanken Labor, MI : Übung 1 SQL - Abfragen Patrick Lipinski

Von der passiven zur aktiven Datenbank II. Trigger Views Prozerdurale SQL-Erweiterungen

5. SQL: Erstellen von Tabellen. Erzeugen und Löschen von Tabellen. Umgang mit Bedingungen (Constraints) Einfügen und Löschen von Daten

Unterabfragen (Subqueries)

Nachtrag: Farben. Farbblindheit. (Light und Bartlein 2004)

Datenbank- und Informationssysteme. Lösungsvorschläge zu Übungsblatt 2. Sommersemester CREATE DOMAIN KennzeichenDomain AS VARCHAR(9);

Transkript:

Übung PL/SQL Trigger Lösungen 1) Gebe das aktuelle Datum aus. Wofür steht dual? Ändere das Datum für Deine aktuelle Session auf das Format Jahr (4 Stellen) Monat (2 Stellen) Tag (2 Stellen)[Leerzeichen]Stunde (2 Stellen) : Minute (2 Stellen) : Sekunde (2 Stellen). SELECT sysdate FROM dual -- Die "dual" Tabelle wird in Oracle gebraucht, wenn das Statement logisch keinen Tabellenna -- men hat. ALTER session SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

2) Ausgangslage. Erstelle die Tabelle stadt_temperatur_fahrenheit, die View berlin_temperatur_celsius und den Trigger berlin_temperatur_hinzufuegen wie in der Vorlesung beschrieben. Fülle die Tabelle mit mind. 2 Datensätzen, mindestens eine Temperaturmessung sollte in Berlin gewesen sein. CREATE TABLE stadt_temperatur_fahrenheit ( timestamp DATE, stadt VARCHAR2(60), fahrenheit NUMBER(4,1), PRIMARY KEY (timestamp, stadt) ); CREATE OR REPLACE VIEW berlin_temperatur_celsius (timestamp, celcius) AS SELECT timestamp, (fahrenheit-32) * 5.0/9.0 FROM stadt_temperatur_fahrenheit WHERE stadt='berlin'; CREATE OR REPLACE TRIGGER berlin_temperatur_hinzufuegen INSTEAD OF INSERT ON berlin_temperatur_celsius INSERT INTO stadt_temperatur_fahrenheit VALUES(:new.timestamp, 'berlin', :new.celcius * 9.0/5.0 + 32); SHOW ERRORS; INSERT INTO stadt_temperatur_fahrenheit VALUES('2009-09-15 11:00:00', 'berlin', 57); INSERT INTO berlin_temperatur_celsius VALUES('2009-09-14 11:00:00', 10.2);

3) Update-Trigger, View. Erstelle eine Update-Trigger, mit dem man auf die View berlin_temperatur_aendern die Updates nach dem Schema: UPDATE berlin_temperatur_celsius SET celcius = 11 WHERE timestamp = '2009-09-07 14:51:47' UPDATE berlin_temperatur_celsius SET celcius = 10, timestamp = '2009-09-07 15:51:47' WHERE timestamp = '2009-09-07 14:51:47' UPDATE berlin_temperatur_celsius SET timestamp = '2009-09-07 16:51:47' WHERE celcius = 10 durchführen kann. CREATE OR REPLACE TRIGGER berlin_temperatur_aendern INSTEAD OF UPDATE ON berlin_temperatur_celsius UPDATE stadt_temperatur_fahrenheit SET fahrenheit = :new.celcius * 9.0/5.0 + 32, timestamp = :new.timestamp WHERE timestamp = :old.timestamp AND stadt = 'berlin'; SHOW ERRORS; UPDATE berlin_temperatur_celsius SET celcius = 11 WHERE timestamp = '2009-09-07 14:51:47' UPDATE berlin_temperatur_celsius SET celcius = 10, timestamp = '2009-09-07 15:51:47' WHERE timestamp = '2009-09-07 14:51:47' UPDATE berlin_temperatur_celsius SET timestamp = '2009-09-07 16:51:47' WHERE celcius = 10

4) UNIQUE. Trigger. Jeder Beliebtheitsrang darf nur einmal vorkommen. Verändere Deine Datensätze in der Tabelle entsprechend, beginnend mit Beliebtheitsrang 1 (2, 3, 4 ohne Lücke folgend). Verändere die Tabelle so, dass jeder Beliebtheitsrang nur einmal vorkommen kann (Hinweis: UNIQUE). Du lernst Lily Allen/London oder Peter Fox/Berlin kennen. Füge sie/ihn auf Rang 2 nach unserem besten Freund/unserer besten Freundin (spielt ja auch ganz gut Gitarre). Erstelle einen Trigger beliebtheit_rang_verschieben mit dem folgendes Statement ausfühbar wird, in dem alle Einträge, die den gleichen oder einen schlechteren Beliebtheitsrang haben einen um 1 schlechteren Rang erhalten: INSERT INTO schlafplatz VALUES(schlafplatz_seq.nextval, 'Lily Allen', 'London', 1,2,1); ALTER TABLE schlafplatz ADD CONSTRAINT beliebtheit_rang_unique UNIQUE(beliebtheit_rang); INSERT INTO schlafplatz VALUES( schlafplatz_seq.nextval, 'Lily Allen', 'London', 1, 2, 1); -- SQL-Fehler: ORA-00001: Unique Constraint (SENGER.BELIEBTHEIT_RANG_UNIQUE) verletzt CREATE OR REPLACE TRIGGER beliebtheit_rang_verschieben BEFORE INSERT ON schlafplatz UPDATE schlafplatz SET beliebtheit_rang = beliebtheit_rang+1 WHERE beliebtheit_rang >= :new.beliebtheit_rang;

5) Mutating table. Heidelberg ist doof, deshalb willst Du alle Schlafplätze in Heidelberg aus der Tabelle schlafplatz entfernen. Dabei sollen aber die Beliebtheitsränge nicht durcheinander geraten. Erstelle (wenn möglich erstmal ohne die Lösung aus dem Anhang) einen Trigger beliebtheit_neu_berechnen, der nach dem Löschen des Datensatzes alle weniger beliebten Schlafplätze um 1 beliebter macht. Lösche alle Schlafplätze in Heidelberg. Du bekommst eine Fehlermeldung. Warum? Lösche den Trigger. Du schreibst die Daten erst mit einem Row-Trigger in eine temporäre Tabelle schlafplatz_beliebtheit_temp mit den Spalten schlafplatz_id und beliebtheit_rang. Du erstellst einen Row-Trigger beliebtheit_neu_berechnen1 mit dem schlafplatz_id und beliebtheit_rang jedes gelöschten Datensatzes in die temporäre Tabelle geschrieben werden. Du erstellst einen Statement-Trigger beliebtheit_neu_berechnen2, der nach dem Löschen mit allen Datensätzen in schlafplatz_beliebtheit_temp die Beliebtheitsränge in schlafplatz entsprechend verschiebt. Lösche alle Schlafplätze in Heidelberg. Siehe Aufgabenblatt.

Übung PL/SQL Trigger Anhang CREATE OR REPLACE TRIGGER beliebtheit_neu_berechnen AFTER DELETE ON schlafplatz UPDATE schlafplatz SET beliebtheit_rang=beliebtheit_rang-1 WHERE beliebtheit_rang > :new.beliebtheit_rang; DELETE FROM schlafplatz WHERE stadt = 'Heidelberg'; --SQL-Fehler: ORA-04091: Tabelle SENGER.SCHLAFPLATZ wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht --ORA-06512: in "SENGER.BELIEBTHEIT_NEU_BERECHNEN", Zeile 2 --ORA-04088: Fehler bei der Ausführung von Trigger 'SENGER.BELIEBTHEIT_NEU_BERECHNEN' --04091. 00000 - "table %s.%s is mutating, trigger/function may not see it" --*Cause: A trigger (or a user defined plsql function that is referenced in -- this statement) attempted to look at (or modify) a table that was -- in the middle of being modified by the statement which fired it. --*Action: Rewrite the trigger (or function) so it does not read that table. DROP TRIGGER beliebtheit_neu_berechnen; ---------------------------------------------------------------------------------- CREATE TABLE schlafplatz_beliebtheit_temp ( schlafplatz_id NUMBER, geloeschter_beliebtheit_rang NUMBER ); CREATE OR REPLACE TRIGGER beliebtheit_neu_berechnen1 AFTER DELETE ON schlafplatz DBMS_OUTPUT.PUT_LINE('schlafplatz_id ' :old.schlafplatz_id ',' :old.beliebtheit_rang); INSERT INTO schlafplatz_beliebtheit_temp VALUES(:old.schlafplatz_id, :old.beliebtheit_rang); CREATE OR REPLACE TRIGGER beliebtheit_neu_berechnen2 AFTER DELETE ON schlafplatz DECLARE CURSOR cur_beliebtheit IS SELECT * FROM schlafplatz_beliebtheit_temp ORDER BY geloeschter_beliebtheit_rang DESC; FOR temp_daten IN cur_beliebtheit LOOP UPDATE schlafplatz SET beliebtheit_rang = beliebtheit_rang-1 WHERE beliebtheit_rang > temp_daten.geloeschter_beliebtheit_rang; END LOOP; DELETE FROM schlafplatz_beliebtheit_temp; DELETE FROM schlafplatz WHERE stadt = 'Heidelberg';