Introdução à Linguagem PL/SQL - Parte 2

Triggers

A TRIGGER (ou gatilho) define uma ação que o banco de dados leva quando um evento relacionado ocorre. Normalmente, a trigger é executada quando uma inserção, atualização ou exclusão de ação para uma tabela ocorre. Triggers podem ser executados ou imediatamente antes ou após uma inserção, atualização ou exclusão evento. É muito utilizada para ajudar a manter a consistência dos dados ou para propagar alterações em um determinado dado de uma tabela para outras.

Um bom exemplo é um gatilho criado para controle de quem alterou a tabela, nesse caso, quando a alteração for efetuada, o gatilho é "disparado" e grava em uma tabela de histórico de alteração, o usuário e data/hora da alteração.

Exemplo de trigger para auditoria em tabela do banco de dados:

create or replace trigger trg_auditoria
	after insert or delete or update
	on produto
	for each row
	begin
		if inserting
		then
			insert into produto_auditoria values
			(
				seq_auditoria.nextval,
				user,
				sysdate,
				'Gravacao de dados: ' || :new.idproduto || ', ' || :new.nome
			);

			
		elsif deleting
		then			
			insert into produto_auditoria values
			(
				seq_auditoria.nextval,
				user,
				sysdate,
				'Delecao de dados: ' || :old.idproduto || ', ' || :old.nome
			);

		elsif updating
		then
			insert into produto_auditoria values
			(
				seq_auditoria.nextval,
				user,
				sysdate,
				'Atualizacao de dados: ' || :new.idproduto || ', ' || :new.nome
			);
		end if;
	end;
	/    

Exemplo de trigger para auditoria de acesso ao banco de dados

create or replace trigger trg_acesso
	after logon on database
	begin
		insert into auditoria_acesso values(
			seqacesso.nextval,
			user,
			current_timestamp
		);
	end;
	/    

Exemplo de trigger para apenas 1 campo da tabela

create or replace trigger trg_funcionario_salario
	after update of salario on funcionario
	for each row
	begin
	
		if :old.salario != :new.salario
		then
			insert into historico_salario values(
				seqsalario.nextval,
				:old.nome || ', Sal de: ' || :old.salario || ' para: ' || :new.salario,
				current_timestamp
			);
		end if;
	
	end;
	/    

No próximo artigo veremos o uso da linguagem PL/SQL para criação de stored procedures.