Você está na página 1de 6

Capítulo 3

DEFINIÇÃO E UTILIZAÇÃO
DE TRIGGER’S
Laboratório de Banco de Dados Cliente/Servidor 3-1

3. Trigger

É um procedimento associado a uma operação e a uma tabela;


Entra em ação automaticamente quando a operação é feita por uma
aplicação ou pelo usuário via SQL.
É executado no servidor;
É armazenado no SGBD;
Não troca informações naturalmente com a aplicação;
É transparente para aplicação e para o usuário.

Para escrever um Trigger


Linguagens dependem do SGBD, mas todos aceitam SQL.

Codificação Procedural
• no ORACLE v8

Pl/Sql ou Java.

• no DB2 v6.o

Cobol, Java, Assembler ou C.

Características:

• Objeto associado.
• Operação.
• Momento em que é ativado.
• Somente uma vez na operação ou para cada linha que a operação for
executada.
• Qualificação OLD ou NEW para as operações que referenciam os atributos
da tabela associada.
• A troca de informações com a aplicação é feita somente através do SQLCODE,
que será setado pelo trigger usando o recurso Raise_Application_Error.
Laboratório de Banco de Dados Cliente/Servidor 3-2

Exemplo 1:

Criar um procedimento que seja ativado automaticamente quando uma


operação de delete ocorrer na tabela EMPREGADO.
Esse procedimento deverá registrar em uma tabela HIST_EMPREGADO
o usuário que está executando a operação e a data.

CREATE OR REPLACE TRIGGER HISTORICO


BEFORE DELETE ON EMPREGADO
BEGIN
INSERT INTO HIST_EMPREGADO VALUES (USER, SYSDATE );
END HISTORICO;
/

OBS: As tabelas EMPREGADO e HIST_EMPREGADO devem ser criadas


antes da criação do Trigger.

Empregado(matric int , nome char(20),salario int, dept char(3));

Hist_Empregado( usuario char(15), data_delecao date);

Exemplo 2:

Criar um procedimento automático que proiba o cadastramento de


empregados com salário menor que 10.000.

CREATE OR REPLACE TRIGGER TESTA_SALARIO


BEFORE INSERT OR UPDATE ON EMPREGADO
FOR EACH ROW
BEGIN
IF :NEW.SALARIO < 10000 THEN
RAISE_APPLICATION_ERROR (-20001, ' Salario fora do limite');
END IF;
END TESTA_SALARIO;
/

OBS.: As variáveis SQLCODE e SQLERRM serão setados com os valores


passados por RAISE_APPLICATION_ERROR.
Laboratório de Banco de Dados Cliente/Servidor 3-3

Exemplo 3:
Criar um procedimento automático para registrar em HIST_VENDA, as
operações de delete, insert e update que ocorrerem na tabela VENDA,
registrando o código do cliente, o produto, a quantidade, o usuário que fez a
operação e o tipo da operação.

CREATE OR REPLACE TRIGGER HISTORICO


BEFORE DELETE OR INSERT OR UPDATE ON VENDA
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO HIST_VENDA VALUES
(:NEW.COD_CLI, :NEW.COD_PRO,:NEW.QUANTIDADE,
USER,'I');

ELSIF DELETING THEN


INSERT INTO HIST_VENDA VALUES
(:OLD. COD_CLI,:OLD. COD_PRO,:OLD.QUANTIDADE,
USER,'D’);
ELSE
INSERT INTO HIST_VENDA VALUES
(:OLD. COD_CLI,:OLD. COD_PRO,:OLD.QUANTIDADE,
USER,'U’);
INSERT INTO HIST_VENDA VALUES
(:NEW. COD_CLI,:NEW. OD_PRO,:NEW.QUANTIDADE,
USER,'U');
END IF;
END HISTORICO;
/

OBS: As tabelas VENDA e HIST_VENDA devem ser criadas antes da criação


do Trigger.

Venda (cod_cli int, cod_pro int , quantidade int);

Hist_Venda (cn char(10),pn char(10),qtd int,usu char(15),oper char(1));

Atenção : A barra que se encontra no final de um trigger é utilizada para


compila-lo.
Laboratório de Banco de Dados Cliente/Servidor 3-4

Exemplo 4:
Criar um procedimento automático para registrar na tabela DELEÇÃO, o
usuário, o número de linhas que ele deletar da tabela ALUNO e a data da
operação.
. Tabela associada ao Trigger: ALUNO.
. Operação que ativa o Trigger: DELETE.
. Momento que o Trigger entra em ação: AFTER.
. Para cada linha que o DELETE atuar: FOR EACH ROW.

(solução 1)

CREATE OR REPLACE TRIGGER HISTORICO


AFTER DELETE ON ALUNO
FOR EACH ROW
DECLARE TOT INT;
BEGIN
SELECT COUNT(*) INTO TOT FROM DELECAO
WHERE USUARIO=USER;
IF TOT=0 THEN
INSERT INTO DELECAO VALUES(USER, 0,SYSDATE);
END IF;
UPDATE DELECAO SET QTD=QTD+1 WHERE USUARIO=USER;
END;
/
(solução 2)

CREATE OR REPLACE TRIGGER HISTORICO


AFTER DELETE ON ALUNO
FOR EACH ROW
DECLARE USU CHAR(10);
BEGIN
SELECT USUARIO INTO USU FROM DELECAO
WHERE USUARIO=USER;
UPDATE DELECAO SET QTD=QTD+1 WHERE USUARIO=USER;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO DELECAO VALUES(USER,1,SYSDATE);
END;
/
OBS: As tabelas ALUNO e DELECAO devem ser criadas antes da criação do
Trigger.
Aluno (matricula int , nome char(20), codigo_curso char(2));
Delecao (usuario char(10), qtd int, data date);
Laboratório de Banco de Dados 3-3

Você também pode gostar