ON UPDATE OF EMPLOYEE.salary
IF NEW.salary > 100000 THEN
EXECUTE IncreaseJobLevel(NEW.enumber, NEW.salary);
END IF;
ON UPDATE OF EMPLOYEE.salary
IF EXTRACT(CURRENT_DATE,'Day')) IN ('Saturday', 'Sunday') THEN
RAISE EXCEPTION 'Salary cannot be updated over a weekend !';
END IF;
ON INSERT INTO EMPLOYEE
SELECT COUNT(*) INTO total_employees FROM EMPLOYEE WHERE dname = NEW.dname;
IF total_employees = 100 THEN
RAISE EXCEPTION 'Too many employees in %', NEW.dname);
END IF;
ON UPDATE OF EMPLOYEE.salary
IF NEW.salary > 100000
EXECUTE IncreaseJobLevel(NEW.enumber, NEW.salary);
CREATE OR REPLACE TRIGGER CheckBudget
BEFORE
UPDATE OF budget ON DEPARTMENT
FOR EACH ROW -- FOR EACH ROW means that it is a row trigger
EXECUTE PROCEDURE CheckBudget();
CREATE OR REPLACE FUNCTION CheckBudget() RETURNS TRIGGER AS $$ BEGIN
IF NOT ( NEW.budget BETWEEN 1 AND 7000 ) THEN
RAISE EXCEPTION 'Budget of department % cannot be equal to %',
NEW.name, NEW.budget;
END IF;
RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER CheckBudget
BEFORE UPDATE OF budget ON DEPARTMENT
FOR EACH ROW
EXECUTE PROCEDURE CheckBudget();
CREATE OR REPLACE FUNCTION CheckBudget()
RETURNS TRIGGER AS
$$
BEGIN
IF NOT ( NEW.budget BETWEEN 1 AND 7000 ) THEN
RAISE EXCEPTION 'Budget of department % cannot be equal to %',
NEW.name, NEW.budget;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER CheckBudget
BEFORE UPDATE OF budget ON DEPARTMENT
FOR EACH ROW
WHEN ( NOT ( NEW.budget BETWEEN 1 AND 7000 ) )
EXECUTE PROCEDURE AbortUpdate();
CREATE OR REPLACE FUNCTION AbortUpdate()
RETURNS TRIGGER AS
$$
BEGIN
RAISE EXCEPTION 'Budget of department % cannot be equal to %',
NEW.name, NEW.budget;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
UPDATE DEPARTMENT SET budget = 100000 WHERE name = 'Physics'; ERROR: Budget of department Physics cannot be equal to 100000.0 CONTEXT: PL/pgSQL function abortupdate() line 3 at RAISE;
UPDATE DEPARTMENT SET budget = 100 WHERE name = 'Physics'; UPDATE 1
BEFORE UPDATE ON DEPARTMENT
AFTER DELETE ON COURSE
INSTEAD OF INSERT ON EMPVIEW
AFTER INSERT OR DELETE ON DEPARTMENT
BEFORE UPDATE OF budget ON DEPARTMENT
BEFORE UPDATE OF cnum, title ON COURSE
AFTER INSERT ON DEPARTMENT
INSTEAD OF TRUNCATE ON DEPARTMENT
AFTER DELETE OR INSERT OR UPDATE ON COURSE
WHEN (NEW.budget > 7000)
WHEN (OLD.budget < 1000 AND NEW.budget > 2000);
WHEN (NEW.amount > 1000 );
WHEN (OLD.credits IN (6, 12));
CREATE OR REPLACE TRIGGER Audit
AFTER DELETE OR INSERT ON DEPARTMENT
FOR EACH STATEMENT
EXECUTE FUNCTION InsertAudit();
CREATE TABLE AUDIT (
statement VARCHAR(10) NOT NULL,
date_time TIMESTAMP NOT NULL,
CONSTRAINT AUDIT_PK PRIMARY KEY (date_time) );
CREATE OR REPLACE FUNCTION InsertAudit() RETURNS TRIGGER AS $$ BEGIN INSERT INTO AUDIT VALUES(TG_OP, current_timestamp); RETURN NULL; END; $$ LANGUAGE plpgsql;
INSERT INTO DEPARTMENT VALUES ('Quantum Computers','QC',30,'Kate',223426.9 );
DELETE FROM DEPARTMENT WHERE name = 'Arts';
DELETE FROM DEPARTMENT;
SELECT * FROM AUDIT; statement | date_time -----------+---------------------------- INSERT | 2023-12-06 14:08:20.475765 DELETE | 2023-12-06 14:08:33.19901 DELETE | 2023-12-06 14:08:41.729328
BEFORE INSERT ON DEPARTMENT
AFTER UPDATE ON EMPLOYEE
AFTER DELETE ON PROJECT
CREATE OR REPLACE TRIGGER UpdateDepartment
AFTER UPDATE ON DEPARTMENT
FOR EACH ROW
EXECUTE FUNCTION UpdateDepartment();
CREATE TABLE AUDIT ( statement VARCHAR(10) NOT NULL, date_time TIMESTAMP NOT NULL, name VARCHAR(50) NOT NULL, oldbudget DECIMAL(9,1) NOT NULL, newbudget DECIMAL(9,1) NOT NULL);
CREATE OR REPLACE FUNCTION UpdateDepartment()
RETURNS TRIGGER AS
$$
BEGIN
INSERT INTO AUDIT VALUES(TG_OP, current_timestamp, OLD.name, OLD.budget,
NEW.budget);
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
UPDATE DEPARTMENT SET budget = budget + 1000; UPDATE 7
SELECT * FROM AUDIT; statement | date_time | name | oldbudget | newbudget ----------+----------------------------+-------------------+-----------+----------- UPDATE | 2023-12-06 18:56:03.402062 | Computer Science | 223426.9 | 224426.9 UPDATE | 2023-12-06 18:56:03.402062 | Physics | 223453.9 | 224453.9 UPDATE | 2023-12-06 18:56:03.402062 | Engineering | 313455.9 | 314455.9 UPDATE | 2023-12-06 18:56:03.402062 | Mathematics | 133456.9 | 134456.9 UPDATE | 2023-12-06 18:56:03.402062 | Education | 173557.9 | 174557.9 UPDATE | 2023-12-06 18:56:03.402062 | Science | 163459.9 | 164459.9 UPDATE | 2023-12-06 18:56:03.402062 | Quantum Computers | 223426.9 | 224426.9 (7 rows)
CREATE TABLE DEPARTMENT( name VARCHAR(50) NOT NULL, code CHAR(5) NOT NULL, total_staff_number DECIMAL(2) NOT NULL, chair VARCHAR(50) NULL, budget DECIMAL(9,1) NOT NULL, CONSTRAINT dept_pkey PRIMARY KEY(name), CONSTRAINT dept_ckey1 UNIQUE(code), CONSTRAINT dept_ckey2 UNIQUE(chair), CONSTRAINT dept_check1 CHECK (total_staff_number BETWEEN 1 AND 50) );
CREATE TABLE COURSE(
cnum CHAR(7) NOT NULL,
title VARCHAR(200) NOT NULL,
credits DECIMAL(2) NOT NULL,
offered_by VARCHAR(50) NULL,
CONSTRAINT course_pkey PRIMARY KEY(cnum),
CONSTRAINT course_check1 CHECK (credits IN (6, 12)),
CONSTRAINT course_fkey1 FOREIGN KEY(offered_by)
REFERENCES DEPARTMENT(name) ON DELETE CASCADE );
ALTER TABLE DEPARTMENT ADD total_courses DECIMAL(2);
UPDATE DEPARTMENT
SET total_courses = (SELECT COUNT(*)
FROM COURSE
WHERE course.offered_by = DEPARTMENT.name);
CREATE OR REPLACE TRIGGER UpdateTotal
AFTER DELETE OR INSERT OR UPDATE ON COURSE
FOR EACH STATEMENT
EXECUTE FUNCTION ChangeTotal();
CREATE OR REPLACE FUNCTION ChangeTotal()
RETURNS TRIGGER AS
$$
BEGIN
UPDATE DEPARTMENT
SET total_courses = (SELECT COUNT(*)
FROM COURSE
WHERE course.offered_by = DEPARTMENT.name);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER UpdateTotal
AFTER DELETE OR INSERT OR UPDATE OF offered_by ON COURSE
FOR EACH ROW
EXECUTE FUNCTION RowChangeTotal();
CREATE OR REPLACE FUNCTION RowChangeTotal()
RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE DEPARTMENT SET total_courses = total_courses - 1 WHERE name = OLD.offered_by;
ELSIF (TG_OP = 'INSERT') THEN
UPDATE DEPARTMENT SET total_courses = total_courses + 1 WHERE name = NEW.offered_by;
ELSE
UPDATE DEPARTMENT SET total_courses = total_courses - 1 WHERE name = OLD.offered_by;
UPDATE DEPARTMENT SET total_courses = total_courses + 1 WHERE name = NEW.offered_by;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;