This repository has been archived by the owner on Aug 5, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreateDatabase.sql
67 lines (54 loc) · 1.84 KB
/
createDatabase.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
-- Altes Löschen
DROP VIEW IF EXISTS preisliste;
DROP TRIGGER IF EXISTS produktTrigger ON produkt;
DROP FUNCTION IF EXISTS change;
DROP TABLE preishist;
DROP TABLE produkt;
DROP TABLE hersteller;
-- Tabellen anlegen
CREATE TABLE hersteller (
hnr varchar(4) PRIMARY KEY,
name varchar(30)
);
CREATE TABLE produkt (
pnr varchar(4) PRIMARY KEY,
name varchar(30),
hnr varchar(4) REFERENCES hersteller(hnr),
preis numeric(8,2),
gueltigab date
);
CREATE TABLE preishist(
phnr SERIAL PRIMARY KEY,
pnr varchar(4) REFERENCES produkt(pnr),
preis numeric(8,2),
gueltigab date
);
-- TRIGGER
CREATE FUNCTION change() RETURNS trigger AS $change$
DECLARE
letzteaenderung DATE;
BEGIN
-- LETZTE ÄNDERUNG SELEKTIEREN
SELECT gueltigab INTO letzteaenderung FROM preishist WHERE pnr = OLD.pnr ORDER BY gueltigab DESC limit 1; --id or gueltigbis macht kein unterschied
IF letzteaenderung IS NULL THEN
letzteaenderung := TO_DATE('01.01.1970', 'DD.MM.YYYY'); --letzteaenderung := old.gueltigab;
END IF;
IF NEW.gueltigab < letzteaenderung THEN
RAISE EXCEPTION 'gueltigab ist älter als das jüngste Änderungsdatum';
END IF;
IF NEW.gueltigab > OLD.gueltigab AND NEW.preis != OLD.preis THEN -- Historientabelle nur dann wenn NEW.gueltigab > OLD.gueltigab, sonst kann Inkonsitenz auftretten
INSERT INTO preishist(pnr, preis, gueltigab) VALUES (OLD.pnr, OLD.preis, OLD.gueltigab);
END IF;
RETURN NEW;
END;
$change$ LANGUAGE plpgsql;
CREATE TRIGGER produktTrigger BEFORE UPDATE ON produkt FOR EACH ROW EXECUTE PROCEDURE change();
-- CREATE VIEW
CREATE VIEW preisliste AS
SELECT h.pnr as pnr, h.gueltigab as gueltigab, h.preis as preis FROM preishist AS h
UNION
SELECT p.pnr as pnr, p.gueltigab as gueltigab, p.preis as preis FROM produkt AS p
ORDER BY gueltigab DESC;
-- Testvalues
-- INSERT HERSTELLER
INSERT INTO hersteller(hnr, name) VALUES ('h1', 'SAP');