Você está na página 1de 3

1)Para que servem os gatilhos (triggers)?

Gatilhos servem para executar açOes automáticas antes ou depois (BEFORE ou AFTER)
de eventos (INSERT Ou UPDATE Ou DELETE) que ocorrem sobre uma tabela (Ou view) .

2)Que tipo de procedimento un gatilho invoca?


Um gatilho invoca um procedimento armazenado.
Um gatilho invoca, mals especificamente, uma função (função engatilhada) .

3)Quais sào os eventos que podem ser "observados" pelos gatilhos?


os eventos que um gatilho pode "observar" são: INSERT ou UPDATE ou DELETE.

4)Quais são os passos básicos para a criaçào e utilização de um gatilho?


Criar uma função engatilhada e depois criar um gatilho que invoque essa função
engatilhada.

5)Qual a diferença entre o BEFORE e o AFTER na criação e utilização de gatilhos?


O BEFORE vai disparar o gatilho antes do evento que ele monitora ser concretizado.
O AFTER vai disparar o gatilho do evento que ele monitora ser concretizado.

6)Qual a diferença entre um procedimento armazenado engatilhado(funçào engatilhada)


e um gatilho e como eles se relacionam?
Uma funçao engatilhada retorna o tipo TRIGGER e executa açoes quando invocada por
um gatilho.
Um gatilho "observa" eventos sobre uma tabela (ou view) ,invocando uma função
engatilhada quando os eventos desejados ocorrem.

7) Como obter os dados velhos e os dados novos utilizando gatilho que está, por
exemplo,
observando atualizaçOes sobre uma tabela?
É possivel usar as palavras reservadas NEW e OLD para obter valores de campos novos
e antigos.
Em uma inserçào, só estará disponivel o NEW. Em uma remoção somente o OLD estará
disponível.

8)
CREATE OR REPLACE FUNCTION
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO Auditoria (nome_antigo, nome_novo) VALUES (OLD.nome, NEW.nome) ;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql' ;

CREATE OR REPLACE TRIGGER trigger_auditoria


AFTER UPDATE OR INSERT OR DELETE ON Colaborador
FOR EACH ROW
EXECUTE PROCEDURE gravar_em_auditoria();

INSERT INTO Colaborador (nome) VALUES ( 'Nome G');


UPDATE Colaborador SET nome : 'Nome Bb' WHERE nome :'Nome B';
DELETE FROM Colaborador WHERE nome= 'Nome Aa';
SELECT *FROM Auditoria;

9)

CREATE OR REPLACE FUNCTION evitar_repeticao()


RETURNS TRIGGER AS $$
DECLARE
res TEXT;

BEGIN

res := (SELECT nome FROM Colaborador WHERE nome=NEW.nome);


IF res IS NULL THEN

RETURN NEW;

END IF;

RAISE EXCEPTION 'Ja existe um colaborador com nome "%"', NEW.nome;

---RETURN NULL;

END;
$$ LANGUAGE 'plpgsql';

CREATE OR REPLACE TRIGGER trigger_evitar repeticao


BEFORE INSERT ON Colaborador FOR EACH ROW
EXECUTE PROCEDURE evitar_repeticao();

INSERT INTO Colaborador(nome) VALUES (Sol);


INSERT INTO Colaborador (nome) VALUES (Hugh);
SELECT *FROM Colaborador;

10) CREATE OR REPLACE FUNCTION evitar_mais de_dez()


RETURNS TRIGGER AS $$
DECLARE
res INTEGER;

BEGIN

res:= (SELECT COUNT(*)FROM Colaborador);


IF res<10 THEN
RETURN NEW

END IF;
RAISE EXCEPTION 'Não é possível cadastrar mais de 10 colaboradores'
---RETURN NULL
END
$$ LANGUAGE 'plgsql'

CREATE OR REPLACE TRIGGER trigger_evitar_mais de_dez


BEFORE INSERT ON Colaborador FOR EACH ROW
EXECUTE PROCEDURE evitar_mais de_dez();

INSERT INTO Colaborador (nome) VALUES ('None Ray);


INSERT INTO Colaborador (nome) VALUES ('Nome Kat');
INSERT INTO Colaborador (nome) VALUES ('Nome Lou');
SELECT * FROM Colaborador ORDER BY codigo;

Você também pode gostar