Triggery

Table of Contents

CREATE TABLE lide 
(jmeno VARCHAR(50) PRIMARY KEY,
 bydliste VARCHAR(50),
 vek INT,
 plat NUMERIC(8,2),
 posledni_zmena TIMESTAMP);

INSERT INTO lide (jmeno, bydliste, vek, plat) VALUES
('Alice', 'Praha', 30, 45000),
('Bob', 'Brno', 28, 30150),
('Cyril', 'Brno', 70, 27000),
('David', 'Olomouc', 45, 13000),
('Ivan', 'Olomouc', 70, 6500),
('Jana', 'Praha', 35, 12300);

----------------------------

CREATE OR REPLACE FUNCTION foo (INT, TEXT) RETURNS int AS $$
DECLARE
        bar int;
        baz int;
        arg1 ALIAS FOR $1;
        arg2 ALIAS FOR $2;
BEGIN
        SELECT vek INTO bar FROM lide WHERE jmeno = arg2;
        baz := 10;
        RETURN arg1 * bar + baz;
END;
$$ LANGUAGE plpgsql;


SELECT foo(2, 'Alice');

----------------------------

CREATE OR REPLACE FUNCTION bar () RETURNS VOID AS $$
DECLARE
        r RECORD;
        x int;
BEGIN
        SELECT count(*) INTO x FROM pg_tables WHERE tablename = 'xyz';
        IF x = 0 THEN
                RAISE NOTICE 'Vytvoril jsem tabulku xyz';
                CREATE TABLE xyz (a int, b int);
        ELSE
                RAISE NOTICE 'Vyprazdnil jsem tabulku xyz';
                DELETE FROM xyz;
        END IF;

        x := 1;
        FOR r IN SELECT * FROM lide
        LOOP
                RAISE NOTICE 'Kopiruji radek %', x;
                INSERT INTO xyz (a, b) VALUES (r.vek, r.plat::int);
                x := x + 1;
        END LOOP;
        RETURN;
END;
$$ LANGUAGE plpgsql;


SELECT bar();
SELECT bar();

---------------------------

CREATE OR REPLACE FUNCTION timestamp_maker() RETURNS TRIGGER AS $$
BEGIN
        new.posledni_zmena = now();
        RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER timestamp_trigger BEFORE UPDATE ON lide FOR EACH ROW EXECUTE PROCEDURE timestamp_maker();


UPDATE lide SET plat = plat + 100 WHERE bydliste = 'Olomouc';

----------------------------

CREATE TABLE log
(id SERIAL PRIMARY KEY,
 ts TIMESTAMP NOT NULL,
 jmeno TEXT,
 msg TEXT NOT NULL,
 zmena INTEGER);


CREATE OR REPLACE FUNCTION salary_audit() RETURNS TRIGGER AS $$
BEGIN
  IF (new.plat > old.plat) THEN
    INSERT INTO log (ts, jmeno, msg, zmena) VALUES
    (now(), new.jmeno, 'Zvyseni platu', new.plat - old.plat);
  END IF;
  IF (new.plat < old.plat) THEN
    INSERT INTO log (ts, jmeno, msg, zmena) VALUES
    (now(), new.jmeno, 'Snizeni platu', old.plat - new.plat);
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER salary_update AFTER UPDATE ON lide FOR EACH ROW EXECUTE PROCEDURE salary_audit();


UPDATE lide SET plat = plat + 100 WHERE bydliste = 'Olomouc';
UPDATE lide SET plat = plat - 100 WHERE bydliste = 'Brno';

Úkoly

  1. Navrhněte tabulku zbozi, která bude obsahovat následující hodnoty:
    • název zboží
    • množství zboží skladem
    • cena za kus
  2. Vytvořte tabulku a odpovídající triggery tak:
    • Aby byla záznamenávána historie cen zboží.
    • Pokud bude zboží odstraněno, bude odstraněna i historie jeho cen.
  3. Vytvořte tabulku a odpovídající triggery tak:
    • Abyste měli uloženou informaci o celkové ceně zboží na skladu.
    • Abyste měli uloženou informaci o průměrné ceně za zboží.

Author: Petr Krajča

Created: 2019-12-02 Mon 16:56

Validate