Вы находитесь на странице: 1из 16

Triggers no MySQL

1
Triggers no MySQL

● Um trigger é um conjunto de instruções SQL armazenadas


no catalogo da BD
● Pertence a um grupo de “stored programs” do MySQL
● Executado quando um evento associado com uma tabela
acontece: insert, delete, update
● Corresponde a um tipo especial de procedimento: stored
procedure, basicamente um bocado de instruções de
programação
● Executado automaticamente antes o depois dum evento
● “Stored programs” include procedimentos e funções

2
“Stored programs” no MySQL
A BD tem objectos definidos em código SQL, armazenadas no
servidor para execução posterior:
● Triggers, diferentes do stored procedure ou stored program: são
chamados automaticamente quando um evento acontece numa
tabela
● O stored program deve ser explicitamente chamado: CALL
● Os procedimentos não devolvem um valor após execução mais
podem modificar os seus parâmetros para inspeção
● As funções são como as funções predefinidas: invocadas numa
expressão elas devolvem um valor após evaluação da expressão
● Existem ainda eventos, tarefas agendadas que o servidor executa
● Vistas, ou “stored queries”: tabelas virtuais (já vimos)

3
Triggers no MySQL

Vantagens dos triggers


● Uma maneira alternativa de verificar a integridade dos
dados
● Podem apanhar erros da lógica do negocio na camada da
BD (e não na camada dos programas de aplicação que
acessam a BD)
● Uma boa maneira de agendar tarefas programadas
● Muito úteis para auditar mudanças na BD

4
Triggers no MySQL

Desvantagens dos triggers


● Não se substituem as validações necessárias a fazer nos
programas de aplicação: php, javascript, asp.net, Perl
● Triggers são difíceis para tirar erros. Os processadores de
BD não são muito bons neste aspecto
● Posto que são chamados automaticamente no interior da
estrutura da BD, é difícil saber o que esta a acontecer
● Podem aumentar o tempo de computação no servidor BD
● Muitos triggers, muito overhead

5
Triggers no MySQL

Quando activar os triggers?


Antes o depois de instruções de actualização na BD
● BEFORE INSERT antes
● AFTER INSERT depois
● BEFORE UPDATE antes actualização
● BEFORE DELETE antes de apagar
● AFTER DELETE após apagar
● Se utilizarmos instruções na BD que não impliquem INSERT,
UPDATE, DELETE, o trigger não é invocado
● Por exemplo TRUNCATE

6
Triggers no MySQL

Triggers devem ter um nome único em toda a BD


● Armazenados na directoria /data/classicmodels/ com
os nomes tabela.TRG, e nome_trigger.TRN
● Tabela.TRG mapea a tabela corresponde trigger
● nome_trigger.TRN tem a definição do trigger
● Os triggers tem todas as opções do stantard SQL, mais
tem algumas limitações.

7
Triggers no MySQL

Limitações dos triggers


● Não podem utilizar SHOW, DATA, LOAD TABLE,
BACKUP DATABASE, RESTORE, FLUSH e RETURN
● Podem utilizar COMMIT, ROLLBACK, START
TRANSACTION, LOCK/UNLOCK TABLES, ALTER,
CREATE, DROP, RENAME
● Podem utilizar PREPARE, EXECUTE
● Podem chamar stored procedures ou funções

8
Triggers no MySQL
Sintaxe:
CREATE TRIGGER nome tempo evento ON tabela
FOR EACH ROW
BEGIN


END

9
Triggers no MySQL
● O nome do trigger debe seguir a convenção:
[nome] [tempo]_[nome tabela]_[evento]
● Ex: create trigger novosportos_before_portos_update
● Activação do trigger pode ser BEFORE ou AFTER um evento
actua sobre uma tabela
● O tempo da activação deve ser especificado na definição do trigger
● Os eventos são: INSERT, UPDATE, DELETE
● Estos eventos lançam automaticamente a execução do trigger
● Associados com uma tabela. Se apagar a tabela apaga o trigger
● Os comandos SQL do trigger colocados entre BEGIN....END
● Palavras chaves OLD e NEW utilizadas para se referir a um tuplo
antes da actualização e o novo tuplo (NEW) após a modificação
feita

10
Triggers no MySQL
● Exemplo:
● Temos a tabela viatura: matricula, nome, estado
● Queremos monitorizar manutenções feitas nelas
● Criamos a tabela auditar_viaturas: matricula, data_modif, descr..
● CREATE TRIGGER antes_manut_viatura
● AFTER UPDATE ON viatura
● FOR EACH ROW BEGIN
● INSERT INTO auditar_viaturas
● SET action = 'insert'
● Matricula = OLD.matricula
● data_modif = NOW() descr= NEW.descr
● END

11

Triggers no MySQL
● Agora actualizamos viatura:
UPDATE viatura
SET estado= “reparada”
E vamos verificar a tabela auditar_viaturas:
SELECT * FROM auditar_viaturas:
Id matricula data_modif descr action
1 34-PO-45 2013-12-02 bla bla update

12
Triggers no MySQL
Como vemos o trigger definido:
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = “nome_bd” AND
Trigger_name = “nome_do_trigger;

Como ver todos os triggers definidos na BD:


SELECT * FROM Information_Schenma.Trigger
WHERE Trigger_schema = “nome_bd”;

E como vemos todos os triggers associados com uma


tabela?
13
Triggers no MySQL

Para apagar um trigger:

DROP TRIGGER nome_tabela.nome_trigger;

No nosso exemplo anterior:


DROP TRIGGER viatura.antes_manut_viatura;

Para modificar um trigger, primeiro devemos apagar :(

14
Triggers no MySQL

Procedimentos e funções:

È de responsabilidade dos srs alunos ver a sintaxe e a forma


de aplicação destas.

Muito semelhantes aos procedimentos e funções que


conhecemos das linguagens de programação standard.

15
Fim do módulo

16

Вам также может понравиться