-- Usunięcie istniejących tabel i procedury DROP TABLE IF EXISTS Historia_ekspozycji, Eksponat, Galeria, Instytucja, Artysta CASCADE; DROP FUNCTION IF EXISTS dodaj_wydarzenie; -- Tworzenie tabel z użyciem INT i sekwencji CREATE TABLE Galeria ( id INT PRIMARY KEY, nazwa VARCHAR(20) NOT NULL ); CREATE SEQUENCE galeria_id_seq START 1; ALTER TABLE Galeria ALTER COLUMN id SET DEFAULT nextval('galeria_id_seq'); CREATE TABLE Artysta ( id_artysty INT PRIMARY KEY, imię VARCHAR(20) NOT NULL, nazwisko VARCHAR(50) NOT NULL, rok_urodzenia DATE NOT NULL, rok_śmierci DATE ); CREATE TABLE Eksponat ( id_eksponatu INT PRIMARY KEY, tytul VARCHAR(20) NOT NULL, typ VARCHAR(20) NOT NULL, wysokosc INT NOT NULL, szerokosc INT NOT NULL, waga INT NOT NULL, Artysta_id_artysty INT REFERENCES Artysta (id_artysty) ); CREATE TABLE Instytucja ( instytucja_id INT PRIMARY KEY, nazwa VARCHAR(20) NOT NULL, miasto VARCHAR(20) NOT NULL ); CREATE TABLE Historia_ekspozycji ( historia_id INT PRIMARY KEY, wydarzenie_typ VARCHAR(20) NOT NULL, data_wypozyczenia DATE NOT NULL, data_oddania DATE NOT NULL, Galeria_id INT NOT NULL REFERENCES Galeria (id), Eksponat_id_eksponatu INT NOT NULL REFERENCES Eksponat (id_eksponatu), Eksponat_id_artysty INT NOT NULL REFERENCES Artysta (id_artysty), Instytucja_instytucja_id INT REFERENCES Instytucja (instytucja_id), sala INT NOT NULL ); -- Tworzenie funkcji CREATE OR REPLACE FUNCTION dodaj_wydarzenie( p_wydarzenie_typ VARCHAR(20), p_data_wypozyczenia DATE, p_data_oddania DATE, p_galeria_id INT, p_eksponat_id INT, p_artysta_id INT, p_instytucja_id INT, p_sala INT ) RETURNS VOID AS $$ BEGIN -- Sprawdzamy, czy istnieje galeria o podanym ID IF NOT EXISTS (SELECT 1 FROM Galeria WHERE id = p_galeria_id) THEN RAISE EXCEPTION 'Ta galeria nie istnieje'; END IF; -- Sprawdzamy, czy istnieje eksponat o podanym ID IF NOT EXISTS (SELECT 1 FROM Eksponat WHERE id_eksponatu = p_eksponat_id) THEN RAISE EXCEPTION 'Eksponat o podanym ID nie istnieje'; END IF; -- Sprawdzamy, czy istnieje artysta o podanym ID IF NOT EXISTS (SELECT 1 FROM Artysta WHERE id_artysty = p_artysta_id) THEN RAISE EXCEPTION 'Nie ma takiego artysty'; END IF; -- Sprawdzamy, czy istnieje instytucja o podanym ID IF NOT EXISTS (SELECT 1 FROM Instytucja WHERE instytucja_id = p_instytucja_id) THEN RAISE EXCEPTION 'Instytucja nie istnieje'; END IF; -- Dodajemy rekord do tabeli Historia_ekspozycji INSERT INTO Historia_ekspozycji ( wydarzenie_typ, data_wypozyczenia, data_oddania, Galeria_id, Eksponat_id_eksponatu, Eksponat_id_artysty, Instytucja_instytucja_id, sala ) VALUES ( p_wydarzenie_typ, p_data_wypozyczenia, p_data_oddania, p_galeria_id, p_eksponat_id, p_artysta_id, p_instytucja_id, p_sala ); RAISE NOTICE 'Dodano nowe wydarzenie!'; END; $$ LANGUAGE plpgsql; -- Funkcja triggera sprawdzająca czas wypożyczenia, czy nie przekracza 30 dni CREATE OR REPLACE FUNCTION sprawdz_czas_wypozyczenia() RETURNS TRIGGER AS $$ BEGIN -- Sprawdzamy, czy różnica między datą oddania a datą wypożyczenia przekracza 30 dni IF NEW.data_oddania - NEW.data_wypozyczenia > 30 THEN RAISE EXCEPTION 'Czas wypożyczenia nie może przekraczać 30 dni!', NEW.historia_id; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Dodanie triggera do tabeli Historia_ekspozycji CREATE TRIGGER trigger_sprawdz_czas BEFORE INSERT OR UPDATE ON Historia_ekspozycji FOR EACH ROW EXECUTE FUNCTION sprawdz_czas_wypozyczenia();