0% found this document useful (0 votes)
7 views9 pages

BD

Uploaded by

Alin Ștefan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views9 pages

BD

Uploaded by

Alin Ștefan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 9

DROP TABLE IF EXISTS Detalii_tratament CASCADE;

DROP TABLE IF EXISTS Tratament CASCADE;


DROP TABLE IF EXISTS Consultatie CASCADE;
DROP TABLE IF EXISTS Diagnosticare CASCADE;
DROP TABLE IF EXISTS Afectiune CASCADE;
DROP TABLE IF EXISTS Buletin_de_analize CASCADE;
DROP TABLE IF EXISTS Istoric_pacient CASCADE;
DROP TABLE IF EXISTS Lista_analize CASCADE;
DROP TABLE IF EXISTS Medicament CASCADE;
DROP TABLE IF EXISTS Pacient CASCADE;
DROP TABLE IF EXISTS Tip_angajat CASCADE;
DROP TABLE IF EXISTS Angajat CASCADE;
DROP TABLE IF EXISTS Echipament CASCADE;
DROP TABLE IF EXISTS Echipament_sectie CASCADE;
DROP TABLE IF EXISTS Salon CASCADE;
DROP TABLE IF EXISTS Detalii_sectie CASCADE;
DROP TABLE IF EXISTS Sectie CASCADE;
DROP TABLE IF EXISTS Spital CASCADE;
DROP TABLE IF EXISTS Adresa CASCADE;

-- Creare tabela Adresa


CREATE TABLE Adresa (
id_adresa SERIAL PRIMARY KEY,
judet VARCHAR(50) NOT NULL,
localitate VARCHAR(50) NOT NULL,
strada VARCHAR(100) NOT NULL
);

-- Creare tabela Spital


CREATE TABLE Spital (
id_spital SERIAL PRIMARY KEY,
denumire_spital VARCHAR(100) NOT NULL,
mail_spital VARCHAR(100),
nr_telefon_spital VARCHAR(15),
statut_juridic VARCHAR(50),
id_adresa INT REFERENCES Adresa(id_adresa) ON DELETE CASCADE
);

-- Creare tabela Sectie


CREATE TABLE Sectie (
id_sectie SERIAL PRIMARY KEY,
denumire_sectie VARCHAR(100) NOT NULL,
nr_medici INT NOT NULL,
id_echipament_sectie INT,
id_spital INT REFERENCES Spital(id_spital) ON DELETE CASCADE
);

-- Creare tabela Detalii_sectie


CREATE TABLE Detalii_sectie (
id_detalii SERIAL PRIMARY KEY,
etaj_sectie INT NOT NULL,
nr_saloane INT NOT NULL,
id_sectie INT REFERENCES Sectie(id_sectie) ON DELETE CASCADE
);

-- Creare tabel Salon


CREATE TABLE Salon (
id_salon SERIAL PRIMARY KEY,
nr_locuri INT NOT NULL,
id_sectie INT REFERENCES Sectie(id_sectie) ON DELETE CASCADE
);

-- Creare tabela Echipament


CREATE TABLE Echipament (
id_echipament SERIAL PRIMARY KEY,
marca_echipament VARCHAR(50) NOT NULL,
model_echipament VARCHAR(50) NOT NULL,
pret_echipament DECIMAL(10, 2),
nr_total_bucati INT NOT NULL,
data_instalare DATE,
ani_garantie INT
);

-- Creare tabela Echipament_sectie


CREATE TABLE Echipament_sectie (
id_echipament_sectie SERIAL PRIMARY KEY,
nr_bucati_pe_sectie INT NOT NULL,
id_echipament INT REFERENCES Echipament(id_echipament) ON DELETE CASCADE,
id_sectie INT REFERENCES Sectie(id_sectie) ON DELETE CASCADE
);

-- Creare tabela Angajat


CREATE TABLE Angajat (
id_angajat SERIAL PRIMARY KEY,
nume_angajat VARCHAR(50) NOT NULL,
prenume_angajat VARCHAR(50) NOT NULL,
functie_angajat VARCHAR(50) NOT NULL,
mail_angajat VARCHAR(100),
salariu_angajat DECIMAL(10, 2),
ani_experienta INT,
nr_telefon_angajat VARCHAR(15),
data_angajare DATE NOT NULL,
id_sectie INT REFERENCES Sectie(id_sectie) ON DELETE CASCADE
);

-- Creare tabela Tip_angajat


CREATE TABLE Tip_angajat (
id_tip SERIAL PRIMARY KEY,
specializare_angajat VARCHAR(100) NOT NULL,
cnp VARCHAR(13) UNIQUE NOT NULL,
id_angajat INT REFERENCES Angajat(id_angajat) ON DELETE CASCADE
);

-- Creare tabela Lista_analize


CREATE TABLE Lista_analize (
id_lista SERIAL PRIMARY KEY,
vsh DECIMAL(5, 2),
glicemie DECIMAL(5, 2),
proteina_c_reactiva DECIMAL(5, 2),
hdl DECIMAL(5, 2),
ldl DECIMAL(5, 2),
creatinina DECIMAL(5, 2),
vitamina_c DECIMAL(5, 2),
calciu_seric DECIMAL(5, 2),
calciu_ionic DECIMAL(5, 2)
);

-- Creare tabela Buletin_de_analize


CREATE TABLE Buletin_de_analize (
id_buletin_analiza SERIAL PRIMARY KEY,
descriere_buletin_analize TEXT NOT NULL,
id_lista INT REFERENCES Lista_analize(id_lista) ON DELETE CASCADE
);

-- Creare tabela Istoric_pacient


CREATE TABLE Istoric_pacient (
id_istoric SERIAL PRIMARY KEY,
data_internare DATE NOT NULL,
data_externare DATE,
simptome TEXT NOT NULL,
diagnostic_prezentat VARCHAR(255)
);

CREATE TABLE Diagnosticare (


id_diagnosticare SERIAL PRIMARY KEY,
denumire_diagnostic VARCHAR(255) NOT NULL,
descriere_diagnostic TEXT,
data_diagnosticului DATE
);

-- Creare tabel Pacient


CREATE TABLE Pacient (
cnp VARCHAR(13) PRIMARY KEY,
nume_pacient VARCHAR(50) NOT NULL,
prenume_pacient VARCHAR(50) NOT NULL,
data_nastere_pacient DATE NOT NULL,
nr_telefon_pacient VARCHAR(15),
greutate_pacient DECIMAL(5, 2),
inaltime_pacient DECIMAL(5, 2),
sex_pacient CHAR(1),
id_istoric INT REFERENCES Istoric_pacient(id_istoric) ON DELETE CASCADE,
id_buletin_analiza INT REFERENCES Buletin_de_analize(id_buletin_analiza) ON
DELETE CASCADE,
id_diagnosticare INT REFERENCES Diagnosticare(id_diagnosticare) ON DELETE
CASCADE
);

-- Creare tabel Afectiune


CREATE TABLE Afectiune (
id_afectiune SERIAL PRIMARY KEY,
denumire_afectiune VARCHAR(100) NOT NULL,
categorie_afectiune VARCHAR(50) NOT NULL
);

-- Creare tabel Medicament


CREATE TABLE Medicament (
id_medicament SERIAL PRIMARY KEY,
denumire_medicament VARCHAR(100) NOT NULL,
mod_administrare VARCHAR(50),
pret_medicament DECIMAL(10, 2),
valabilitate DATE,
stoc_disponibil INT NOT NULL,
doza_zilnica VARCHAR(50)
);

-- Creare tabel Detalii_tratament


CREATE TABLE Detalii_tratament (
id_detalii_tratament SERIAL PRIMARY KEY,
nr_zile_tratament INT NOT NULL,
id_medicament INT REFERENCES Medicament(id_medicament) ON DELETE CASCADE
);

-- Creare tabel Tratament


CREATE TABLE Tratament (
id_tratament SERIAL PRIMARY KEY,
dataleliberare_tratament DATE NOT NULL
);

-- Creare tabel Consultatie


CREATE TABLE Consultatie (
id_consultatie SERIAL PRIMARY KEY,
id_diagnosticare INT REFERENCES Diagnosticare(id_diagnosticare) ON DELETE
CASCADE,
id_afectiune INT REFERENCES Afectiune(id_afectiune) ON DELETE CASCADE,
stadiu_actual_afectiune VARCHAR(50),
id_tratament INT REFERENCES Tratament(id_tratament) ON DELETE CASCADE
);

INSERT INTO Adresa (id_adresa, judet, localitate, strada) VALUES


(1, 'Cluj', 'Cluj-Napoca', 'Str. Memorandumului'),
(2, 'București', 'Sector 1', 'Str. Aviatorilor'),
(3, 'Iași', 'Iași', 'Str. Palatului');

INSERT INTO Spital (id_spital, denumire_spital, mail_spital, nr_telefon_spital,


statut_juridic, id_adresa) VALUES
(10, 'Spital Județean Cluj', '[email protected]', '0264123456', 'Public', 1),
(20, 'Spital Universitar București', '[email protected]', '031654987', 'Public', 2),
(30, 'Spital Clinic Iași', '[email protected]', '0232123123', 'Public', 3);

INSERT INTO Sectie (id_sectie, denumire_sectie, nr_medici, id_echipament_sectie)


VALUES
(100, 'Cardiologie', 10, 101),
(200, 'Chirurgie', 8, 201);

INSERT INTO Echipament (id_echipament, marca_echipament, model_echipament,


pret_echipament, nr_total_bucati, data_instalare, ani_garantie) VALUES
(101, 'Siemens', 'Model A1', 50000, 5, '2020-01-10', 5),
(201, 'Philips', 'Model B2', 30000, 3, '2021-03-15', 4);

INSERT INTO Angajat (id_angajat, nume_angajat, prenume_angajat, functie_angajat,


mail_angajat, ani_experienta, nr_telefon_angajat, data_angajare, id_sectie) VALUES
(1000, 'Popescu', 'Andrei', 'Medic', '[email protected]', 5, '0721123456', '2019-01-
15', 100),
(2000, 'Ionescu', 'Maria', 'Asistent', '[email protected]', 2, '0722123456', '2022-
05-01', 200);

INSERT INTO Istoric_pacient (id_istoric, data_internare, data_externare, simptome,


diagnostic_prezentat) VALUES
(1001, '2023-11-01', '2023-11-15', 'Durere toracică', 'Infarct miocardic'),
(2001, '2023-10-20', '2023-10-25', 'Dureri abdominale', 'Apendicită acută');

INSERT INTO Lista_analize (id_lista, vsh, glicemie, proteina_c_reactiva, hdl, ldl,


creatinina, vitamina_c, calciu_seric, calciu_ionic) VALUES
(1011, 10, 85, 5, 55, 110, 1.0, 0.8, 9.5, 4.5),
(2011, 12, 90, 6, 60, 120, 1.2, 0.9, 9.8, 4.7);
INSERT INTO Buletin_de_analize (id_buletin_analiza, descriere_buletin_analize,
id_lista) VALUES
(1101, 'Rezultate analize generale', 1011),
(2101, 'Analize pre-operatorii', 2011);

INSERT INTO Diagnosticare (id_diagnosticare, denumire_diagnostic,


descriere_diagnostic, data_diagnosticului) VALUES
(900, 'Infarct miocardic', 'Blocaj arterei coronare', '2023-11-01'),
(901, 'Apendicită', 'Inflamație apendice', '2023-10-20');

INSERT INTO Pacient (CNP, nume_pacient, prenume_pacient, data_nastere_pacient,


nr_telefon_pacient, greutate_pacient, inaltime_pacient, sex_pacient, id_istoric,
id_buletin_analiza, id_diagnosticare) VALUES
('1234567890', 'Moldovan', 'Ioana', '1990-06-15', '0745123456', 65, 165, 'F', 1001,
1101, 900),
('0987654321', 'Miroslav', 'Stefan', '2000-08-18', '0788956774', 80, 170,
'B',NULL,2101,901);

INSERT INTO Medicament (id_medicament, denumire_medicament, mod_administrare,


pret_medicament, valabilitate, stoc_disponibil, doza_zilnica) VALUES
(800, 'Paracetamol', 'Oral', 5, '2023-12-10', 100, 3);

INSERT INTO Tip_angajat (id_tip, specializare_angajat, cnp, id_angajat) VALUES


(700, 'Cardiologie', '1234567890', 1000),
(701, 'Chirurgie', '2345678901', 2000);

INSERT INTO Salon (id_salon, nr_locuri, id_sectie) VALUES


(500, 10, 100),
(501, 15, 200);

INSERT INTO Afectiune (id_afectiune, denumire_afectiune, categorie_afectiune)


VALUES
(600, 'Infarct miocardic', 'Cardiovascular'),
(601, 'Apendicită acută', 'Chirurgical');

INSERT INTO Tratament (id_tratament, dataleliberare_tratament) VALUES


(400, '2023-11-15'),
(401, '2023-10-25');

INSERT INTO Consultatie (id_consultatie, id_diagnosticare, id_afectiune,


stadiu_actual_afectiune, id_tratament) VALUES
(300, 900, 600, 'Stabil', 400),
(301, 901, 601, 'Ameliorat', 401);

INSERT INTO Detalii_tratament (id_detalii_tratament, nr_zile_tratament,


id_medicament) VALUES
(200, 7, 800);

--1) Trigger pentru a actualiza câmpul 'salariu_angajat' la fiecare inserție în


tabela Angajat
CREATE OR REPLACE FUNCTION update_salariu_angajat()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.ani_experienta < 3 THEN
NEW.salariu_angajat := 4000; -- Salariu minim pentru angajații cu mai
puțin de 3 ani de experiență
ELSE
NEW.salariu_angajat := 6000; -- Salariu minim pentru angajații cu mai mult
de 3 ani de experiență
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_salariu_angajat


BEFORE INSERT ON Angajat
FOR EACH ROW
EXECUTE FUNCTION update_salariu_angajat();

--2) Trigger pentru a verifica valabilitatea medicamentelor înainte de inserare


CREATE OR REPLACE FUNCTION check_medicament_valabilitate()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.valabilitate < CURRENT_DATE THEN
RAISE EXCEPTION 'Medicamentul este expirat!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_check_medicament_valabilitate


BEFORE INSERT ON Medicament
FOR EACH ROW
EXECUTE FUNCTION check_medicament_valabilitate();

--3) Trigger pentru a actualiza numărul de locuri disponibile din Salon după
inserarea unui pacient
CREATE OR REPLACE FUNCTION update_locuri_salon()
RETURNS TRIGGER AS $$
BEGIN
UPDATE Salon
SET nr_locuri = nr_locuri - 1
WHERE id_salon = NEW.id_salon;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_locuri_salon


AFTER INSERT ON Pacient
FOR EACH ROW
EXECUTE FUNCTION update_locuri_salon();

--4) Trigger pentru a verifica dacă un pacient are un istoric valid înainte de
inserarea unui nou pacient
CREATE OR REPLACE FUNCTION check_pacient_istoric()
RETURNS TRIGGER AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM Istoric_pacient WHERE id_istoric = NEW.id_istoric)
THEN
RAISE EXCEPTION 'Istoricul pacientului nu există!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_check_pacient_istoric


BEFORE INSERT ON Pacient
FOR EACH ROW
EXECUTE FUNCTION check_pacient_istoric();

--5) Trigger pentru a actualiza numărul de medici dintr-o secție după inserarea
unui nou angajat
CREATE OR REPLACE FUNCTION update_numar_medici()
RETURNS TRIGGER AS $$
BEGIN
UPDATE Sectie
SET nr_medici = nr_medici + 1
WHERE id_sectie = NEW.id_sectie;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_numar_medici


AFTER INSERT ON Angajat
FOR EACH ROW
EXECUTE FUNCTION update_numar_medici();

--6) Trigger pentru a verifica și șterge pacientul dacă nu mai există în tabelul
Istoric_pacient
CREATE OR REPLACE FUNCTION delete_pacient_if_no_istoric()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM Pacient WHERE id_istoric IS NULL;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_delete_pacient_if_no_istoric


AFTER DELETE ON Istoric_pacient
FOR EACH ROW
EXECUTE FUNCTION delete_pacient_if_no_istoric();

--7) Trigger pentru a preveni ștergerea unui medicament care este în utilizare
(într-un tratament)
CREATE OR REPLACE FUNCTION prevent_delete_medicament_in_tratament()
RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (SELECT 1 FROM Detalii_tratament WHERE id_medicament =
OLD.id_medicament) THEN
RAISE EXCEPTION 'Medicamentul este utilizat într-un tratament și nu poate
fi șters!';
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_prevent_delete_medicament_in_tratament


BEFORE DELETE ON Medicament
FOR EACH ROW
EXECUTE FUNCTION prevent_delete_medicament_in_tratament();

--8) Trigger pentru a actualiza statusul unui pacient în funcție de data externării
CREATE OR REPLACE FUNCTION update_data_externare()
RETURNS TRIGGER AS $$
BEGIN
NEW.data_externare := CURRENT_DATE;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_data_externare


BEFORE UPDATE ON Istoric_pacient
FOR EACH ROW
WHEN (NEW.data_externare IS NOT NULL)
EXECUTE FUNCTION update_data_externare();

--9) Trigger pentru a preveni inserarea unui pacient cu aceeași dată de naștere ca
un alt pacient
CREATE OR REPLACE FUNCTION prevent_duplicate_birthdate()
RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (SELECT 1 FROM Pacient WHERE data_nastere_pacient =
NEW.data_nastere_pacient) THEN
RAISE EXCEPTION 'Există deja un pacient cu această dată de naștere!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_prevent_duplicate_birthdate


BEFORE INSERT ON Pacient
FOR EACH ROW
EXECUTE FUNCTION prevent_duplicate_birthdate();

--10) Trigger pentru a actualiza prețul echipamentului la fiecare inserție sau


actualizare
CREATE OR REPLACE FUNCTION update_pret_echipament()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.ani_garantie > 5 THEN
NEW.pret_echipament := NEW.pret_echipament * 1.1; -- Adaugă 10% dacă are
garanție mai mare de 5 ani
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_pret_echipament


AFTER INSERT OR UPDATE ON Echipament
FOR EACH ROW
EXECUTE FUNCTION update_pret_echipament();

--11) Trigger pentru a actualiza cantitatea de echipamente într-o secție


CREATE OR REPLACE FUNCTION update_numar_echipamente_sectie()
RETURNS TRIGGER AS $$
BEGIN
UPDATE Echipament_sectie
SET nr_bucati_pe_sectie = nr_bucati_pe_sectie + 1
WHERE id_sectie = NEW.id_sectie;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_numar_echipamente_sectie


AFTER INSERT ON Echipament
FOR EACH ROW
EXECUTE FUNCTION update_numar_echipamente_sectie();

--12) Trigger pentru a preveni actualizarea unui pacient dacă nu există un


diagnostic
CREATE OR REPLACE FUNCTION prevent_update_if_no_diagnostic()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.id_diagnosticare IS NULL THEN
RAISE EXCEPTION 'Pacientul nu are un diagnostic asociat și nu poate fi
actualizat!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_prevent_update_if_no_diagnostic


BEFORE UPDATE ON Pacient
FOR EACH ROW
EXECUTE FUNCTION prevent_update_if_no_diagnostic();

You might also like