-- tables CREATE TABLE artysta ( id_a serial primary key, imie varchar(32) NOT NULL, nazwisko varchar(32) NOT NULL, rok_urodzenia date NOT NULL, rok_smierci date ); CREATE TABLE wystawione( id_wystawy int primary key, eksponat_id int not null, galeria_id int not null, sala varchar(32) not null, data_wystawienia date not null, data_zakonczenia date null ); CREATE TABLE eksponat ( id_e serial primary key, tytul varchar(255) NOT NULL, typ varchar(128) NOT NULL, szerokosc decimal(5,2) NOT NULL, wysokosc decimal(5,2) NOT NULL, waga decimal(5,2) NOT NULL, cenne boolean NOT NULL, artysta_id_a int NULL, status varchar(128) NOT NULL ); CREATE TABLE galeria ( id_galeria serial primary key, nazwa varchar(40) NOT NULL, sala Varchar(100) NOT NULL, muzeum_naz varchar(64) NOT NULL ); CREATE TABLE historia_wypozyczen ( id_wypozyczenia serial primary key, eksponat_id int NOT NULL, instytucja_id_i int NOT NULL, data_wypozyczenia date NOT NULL, data_zakonczenia date NULL ); CREATE TABLE instytucja ( id_i serial primary key, nazwa Varchar(128) NOT NULL, miasto varchar(32) NOT NULL ); CREATE TABLE magazyn ( id_magazyn serial primary key, eksponat_id_e int not null, dota_magazynowania date not null, koniec_magazynowania date null ); CREATE TABLE muzeum ( nazwa varchar(64) primary key ); -- foreign keys ALTER TABLE galeria ADD CONSTRAINT galeria_muzeum FOREIGN KEY (muzeum_naz) REFERENCES muzeum (nazwa) ; ALTER TABLE wystawione ADD CONSTRAINT wyst_eksponat_id FOREIGN KEY (eksponat_id) REFERENCES eksponat (id_e) ; ALTER TABLE wystawione ADD CONSTRAINT wyst_galeria_id FOREIGN KEY (galeria_id) REFERENCES galeria (id_galeria) ; ALTER TABLE eksponat ADD CONSTRAINT eksponat_artysta FOREIGN KEY (artysta_id_a) REFERENCES artysta (id_a) ; ALTER TABLE historia_wypozyczen ADD CONSTRAINT wypozyczenia_eksponat FOREIGN KEY (eksponat_id) REFERENCES eksponat (id_e) ; ALTER TABLE historia_wypozyczen ADD CONSTRAINT wypozyczenia_instytucja FOREIGN KEY (instytucja_id_i) REFERENCES instytucja (id_i) ; ALTER TABLE magazyn ADD CONSTRAINT magazyn_eksponat FOREIGN KEY (eksponat_id_e) REFERENCES eksponat (id_e) ; -- sprawdzanie czy kazdy artysta ma eksponat CREATE OR REPLACE FUNCTION artysta_posiada_eksponat() RETURNS TRIGGER AS $$ DECLARE art RECORD; iloscEksponatow INT; BEGIN -- Iterujemy przez wszystkich artystów FOR art IN SELECT id_a, imie, nazwisko FROM artysta LOOP -- Sprawdzamy, czy artysta ma przynajmniej jeden eksponat w muzeum (wystawiony lub magazynowany) SELECT COUNT(*) INTO iloscEksponatow FROM eksponat WHERE artysta_id_a = art.id_a; -- Jeśli artysta nie ma eksponatów, wyświetlamy komunikat IF iloscEksponatow = 0 THEN RAISE NOTICE 'Artysta % % nie ma żadnych eksponatów', art.imie, art.nazwisko; END IF; END LOOP; END; $$ LANGUAGE plpgsql; CREATE TRIGGER artystaMaEksponat AFTER INSERT ON artysta FOR EACH ROW EXECUTE FUNCTION artysta_posiada_eksponat();