| 1 |
|
|---|
| 2 | -- explain plan za analiza
|
|---|
| 3 | EXPLAIN (ANALYZE, BUFFERS)
|
|---|
| 4 | SELECT * from Zapisnik
|
|---|
| 5 | WHERE datum BETWEEN '2024-03-01' AND '2024-03-31';
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 | ----dodavanje na datum vo zavisnite tabeli
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 | ALTER TABLE Stavka_Zapisnik DISABLE TRIGGER USER;
|
|---|
| 12 |
|
|---|
| 13 | ALTER TABLE Stavka_Zapisnik ADD COLUMN datum_zapisnik date;
|
|---|
| 14 | UPDATE Stavka_Zapisnik sz
|
|---|
| 15 | SET datum_zapisnik = z.datum
|
|---|
| 16 | FROM Zapisnik z
|
|---|
| 17 | WHERE sz.id_na_zapisnik = z.id_na_zapisnik;
|
|---|
| 18 |
|
|---|
| 19 | ALTER TABLE Stavka_Zapisnik ENABLE TRIGGER USER;
|
|---|
| 20 |
|
|---|
| 21 | ALTER TABLE Uplata ADD COLUMN datum_zapisnik date;
|
|---|
| 22 | UPDATE Uplata u
|
|---|
| 23 | SET datum_zapisnik = z.datum
|
|---|
| 24 | FROM Zapisnik z
|
|---|
| 25 | WHERE u.id_zapisnik = z.id_na_zapisnik;
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 | ---drop na constraint za foreign key
|
|---|
| 31 |
|
|---|
| 32 | ALTER TABLE Stavka_Zapisnik DROP CONSTRAINT IF EXISTS stavka_zapisnik_id_na_zapisnik_fkey;
|
|---|
| 33 | ALTER TABLE Uplata DROP CONSTRAINT IF EXISTS uplata_id_zapisnik_fkey;
|
|---|
| 34 |
|
|---|
| 35 |
|
|---|
| 36 | --preimenuvanje na zapisnik
|
|---|
| 37 | ALTER TABLE Zapisnik RENAME TO Zapisnik_old;
|
|---|
| 38 |
|
|---|
| 39 |
|
|---|
| 40 | -- ---- particionirana Zapisnik so kompoziten kluc(id_na_zapisnik, datum)
|
|---|
| 41 | CREATE TABLE Zapisnik (
|
|---|
| 42 | id_na_zapisnik int,
|
|---|
| 43 | vreme time,
|
|---|
| 44 | datum date NOT NULL,
|
|---|
| 45 | lokacija varchar(100),
|
|---|
| 46 | Potpis boolean DEFAULT false,
|
|---|
| 47 | id_slucaj int,
|
|---|
| 48 | status_zapisnik varchar(20) DEFAULT 'Otvoren' CHECK (status_zapisnik IN ('Otvoren', 'Zatvoren')),
|
|---|
| 49 | EMBG_Prekrsuvach char(13),
|
|---|
| 50 | Vozilo_Broj_Sasija varchar(17),
|
|---|
| 51 | EMBG_Policaec char(13),
|
|---|
| 52 | PRIMARY KEY (id_na_zapisnik, datum),
|
|---|
| 53 | FOREIGN KEY (id_slucaj) REFERENCES Slucaj(id_slucaj) ON UPDATE CASCADE ON DELETE RESTRICT,
|
|---|
| 54 | FOREIGN KEY (EMBG_Prekrsuvach) REFERENCES Gragjanin(EMBG) ON UPDATE CASCADE ON DELETE RESTRICT,
|
|---|
| 55 | FOREIGN KEY (Vozilo_Broj_Sasija) REFERENCES Vozilo(broj_na_sasija) ON UPDATE CASCADE ON DELETE RESTRICT,
|
|---|
| 56 | FOREIGN KEY (EMBG_Policaec) REFERENCES Policaec(EMBG_P) ON UPDATE CASCADE ON DELETE RESTRICT
|
|---|
| 57 | ) PARTITION BY RANGE (datum);
|
|---|
| 58 |
|
|---|
| 59 |
|
|---|
| 60 |
|
|---|
| 61 | CREATE TABLE Zapisnik_2021 PARTITION OF Zapisnik FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');
|
|---|
| 62 | CREATE TABLE Zapisnik_2022 PARTITION OF Zapisnik FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');
|
|---|
| 63 | CREATE TABLE Zapisnik_2023 PARTITION OF Zapisnik FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
|
|---|
| 64 | CREATE TABLE Zapisnik_2024 PARTITION OF Zapisnik FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
|
|---|
| 65 | CREATE TABLE Zapisnik_2025 PARTITION OF Zapisnik FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
|
|---|
| 66 | CREATE TABLE Zapisnik_2026 PARTITION OF Zapisnik FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');
|
|---|
| 67 | CREATE TABLE Zapisnik_default PARTITION OF Zapisnik DEFAULT;
|
|---|
| 68 |
|
|---|
| 69 | ----migracija na podatocite
|
|---|
| 70 |
|
|---|
| 71 | INSERT INTO Zapisnik (id_na_zapisnik, vreme, datum, lokacija, Potpis,
|
|---|
| 72 | id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
|
|---|
| 73 | SELECT id_na_zapisnik, vreme, datum, lokacija, Potpis,
|
|---|
| 74 | id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec
|
|---|
| 75 | FROM Zapisnik_old;
|
|---|
| 76 |
|
|---|
| 77 | ANALYZE Zapisnik;
|
|---|
| 78 |
|
|---|
| 79 | ---- вrakanje na avtomatskata numeracija na id_na_zapisnik
|
|---|
| 80 | ALTER TABLE Zapisnik ALTER COLUMN id_na_zapisnik SET DEFAULT nextval('zapisnik_id_na_zapisnik_seq');
|
|---|
| 81 | ALTER SEQUENCE zapisnik_id_na_zapisnik_seq OWNED BY Zapisnik.id_na_zapisnik;
|
|---|
| 82 | SELECT setval('zapisnik_id_na_zapisnik_seq', (SELECT COALESCE(MAX(id_na_zapisnik), 1) FROM Zapisnik));
|
|---|
| 83 |
|
|---|
| 84 |
|
|---|
| 85 |
|
|---|
| 86 | ---- Vraten integritetot
|
|---|
| 87 | ALTER TABLE Stavka_Zapisnik
|
|---|
| 88 | ADD CONSTRAINT stavka_zapisnik_zapisnik_fk
|
|---|
| 89 | FOREIGN KEY (id_na_zapisnik, datum_zapisnik)
|
|---|
| 90 | REFERENCES Zapisnik (id_na_zapisnik, datum)
|
|---|
| 91 | ON UPDATE CASCADE ON DELETE CASCADE;
|
|---|
| 92 |
|
|---|
| 93 |
|
|---|
| 94 | ALTER TABLE Uplata
|
|---|
| 95 | ADD CONSTRAINT uplata_zapisnik_fk
|
|---|
| 96 | FOREIGN KEY (id_zapisnik, datum_zapisnik)
|
|---|
| 97 | REFERENCES Zapisnik (id_na_zapisnik, datum)
|
|---|
| 98 | ON UPDATE CASCADE ON DELETE RESTRICT;
|
|---|
| 99 |
|
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 |
|
|---|
| 103 | -- ---- Raspredelba po particii
|
|---|
| 104 | SELECT tableoid::regclass AS particija, COUNT(*) AS redovi
|
|---|
| 105 | FROM Zapisnik GROUP BY 1 ORDER BY 1;
|
|---|
| 106 |
|
|---|
| 107 | ----Funkcija za avtomatsko kreiranje na particii za ponatamosni godini
|
|---|
| 108 |
|
|---|
| 109 | CREATE OR REPLACE PROCEDURE avtomatiziraj_particija(p_godina int)
|
|---|
| 110 | LANGUAGE plpgsql
|
|---|
| 111 | AS $$
|
|---|
| 112 | BEGIN
|
|---|
| 113 |
|
|---|
| 114 | EXECUTE format(
|
|---|
| 115 | 'CREATE TABLE IF NOT EXISTS Zapisnik_%s PARTITION OF Zapisnik FOR VALUES FROM (%L) TO (%L);',
|
|---|
| 116 | p_godina,
|
|---|
| 117 | p_godina::text || '-01-01',
|
|---|
| 118 | (p_godina + 1)::text || '-01-01'
|
|---|
| 119 | );
|
|---|
| 120 | RAISE NOTICE 'Партицијата за % година е успешно креирана.', p_godina;
|
|---|
| 121 | END;
|
|---|
| 122 | $$;
|
|---|
| 123 | --povik na funkcijata
|
|---|
| 124 | CALL avtomatiziraj_particija(2027); |
|---|