Você está na página 1de 6

CREATE TABLE EMPREGADOS(

NOME VARCHAR(50) PRIMARY KEY,


SAL FLOAT,
DEPTO INTEGER,
GERENTE VARCHAR(50)
);
CREATE TABLE DEPARTAMENTO(
DEPTO INTEGER PRIMARY KEY,
ORCAMENTO FLOAT
);

--INSERT
CREATE OR REPLACE FUNCTION INSERT_SAL() RETURNS TRIGGER AS
$BODY$
BEGIN
IF(NEW.SAL + (SELECT SUM(SAL)
FROM EMPREGADOS E
WHERE

E.DEPTO=NEW.DEPTO))>(SELECT ORCAMENTO

FROM DEPARTAMENTO D WHERE D.DEPTO = NEW.DEPTO)


THEN
RAISE NOTICE 'No possvel incluir um novo empregado,
pois o oramento insuficiente';
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER INSERT_SAL BEFORE INSERT ON EMPREGADOS


FOR EACH ROW EXECUTE PROCEDURE INSERT_SAL();

--UPDATE
CREATE OR REPLACE FUNCTION UPDATE_SAL() RETURNS TRIGGER AS
$BODY$
BEGIN
IF(NEW.SAL + (SELECT SUM(SAL)

FROM EMPREGADOS E WHERE E.DEPTO=NEW.DEPTO and


E.NOME!=NEW.NOME)) > (SELECT ORCAMENTO FROM DEPARTAMENTO D WHERE
D.DEPTO = NEW.DEPTO)
THEN
RAISE NOTICE 'No possvel aumentar o salrio do
empregado, pois o oramento insuficiente';
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER UPDATE_SAL BEFORE UPDATE ON EMPREGADOS FOR EACH


ROW EXECUTE PROCEDURE UPDATE_SAL();

--Questo 1 a) UPDATE ORAMENTO

A soma do salrio dos empregados de um


departamento no pode ultrapassar o
oramento do departamento
CREATE OR REPLACE FUNCTION UPDATE_ORC() RETURNS TRIGGER AS
$BODY$
BEGIN
IF NEW.ORCAMENTO < (SELECT SUM(SAL) FROM EMPREGADOS E WHERE
E.DEPTO=NEW.DEPTO) THEN
RAISE NOTICE 'No possvel alterar o oramento, pois o
novo oramento no suficiente para pagar o salrio do
departamento';
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$BODY$

LANGUAGE plpgsql;

CREATE TRIGGER UPDATE_ORC BEFORE UPDATE OF ORCAMENTO ON


DEPARTAMENTO FOR EACH ROW EXECUTE PROCEDURE UPDATE_ORC();

--Questo 1 b) INSERT EMPREGADO

Empregados de um mesmo departamento tem o mesmo


gerente.
CREATE OR REPLACE FUNCTION INSERT_EMP() RETURNS TRIGGER AS
$BODY$
BEGIN
IF (EXISTS (SELECT * FROM EMPREGADOS E
WHERE E.DEPTO = NEW.DEPTO AND E.GERENTE != NEW.GERENTE))
THEN
RAISE NOTICE 'Gerente invlido';
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER INSERT_EMP BEFORE INSERT ON EMPREGADOS FOR EACH


ROW EXECUTE PROCEDURE INSERT_EMP();

--Questo 1 b) UPDATE GERENTE


* Se o gerente de um empregado mudar ento todos os
empregados do mesmo departamento tero seu gerente
alterado.
CREATE OR REPLACE FUNCTION UPDATE_GER() RETURNS TRIGGER AS
$BODY$
BEGIN
UPDATE EMPREGADOS E
SET E.GERENTE = NEW.GERENTE

WHERE E.DEPTO = NEW.DEPTO;


RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER UPDATE_GER AFTER UPDATE OF GERENTE ON EMPREGADOS


FOR EACH ROW EXECUTE PROCEDURE UPDATE_GER();

--Questo 2 a)
Escreva outro trigger VdelR para manter a
consistncia de V com relao a remoes em R

CREATE OR REPLACE FUNCTION VdelR() RETURNS TRIGGER AS


$BODY$
BEGIN
IF (OLD.A > 5)THEN
DELETE FROM V WHERE V.A = OLD.A;
RETURN OLD;
END IF;
RETURN NULL;

END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER VdelR AFTER DELETE ON R


FOR EACH ROW EXECUTE PROCEDURE VdelR();

--Questo 2 b) Escreva outro trigger VupdR para manter a


consistncia de V com relao a modificaes em R
CREATE OR REPLACE FUNCTION
$BODY$
BEGIN

VupdR() RETURNS TRIGGER AS

IF (NEW.A < 5) AND (OLD.A>5) THEN


DELETE FROM V

WHERE V.A = NEW.A;

RETURN OLD;
ELSIF ((NEW.A > 5) AND (OLD.A > 5)) THEN
UPDATE V SET V.A = NEW.A WHERE R.A = V.A;
RETURN NEW;
ELSIF ((NEW.A > 5) AND (OLD.A <= 5)) THEN
INSERT INTO V SELECT * FROM R WHERE NEW.A=R.A;
RETURN NEW;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER VupdR AFTER UPDATE ON R FOR EACH ROW EXECUTE


PROCEDURE VdelR();

--Questo 2 c) Suponha a relao R(A,B,C) onde A,B e


C so do tipo inteiro e A chave de R. Escreva os
comandos SQL e triggers para criar, povoar e manter
uma viso materializada V definida por: SELECT A, B
FROM R ;

Criando a viso materializada:


CREATE TABLE Vc(A int, B int, C int);

INSERT INTO Vc
SELECT A, B FROM R;

CREATE OR REPLACE FUNCTION

VinsR() RETURNS TRIGGER AS

$BODY$
BEGIN
INSERT INTO Vc(A,B) SELECT A,B FROM NEW;
RETURN NEW;

END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER VupdR AFTER INSERT ON R FOR EACH ROW EXECUTE


PROCEDURE VinsR();

--Questo 2 d) Suponha as relaes R(A,B) e S(B,C) onde

todos os atributos so do tipo inteiro e R.A e S.B so


chaves de R e S respectivamente. Escreva os comandos
SQL e triggers para criar, povoar e manter uma viso
materializada V definida por:
CREATE OR REPLACE FUNCTION

VinsRd() RETURNS TRIGGER AS

$BODY$
BEGIN
INSERT INTO Vc(A,B,C) SELECT A, B ,C
FROM R,NEW WHERE R.B = NEW.B;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER VinsRd AFTER INSERT ON R FOR EACH ROW EXECUTE


PROCEDURE VinsRd();