1
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
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
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
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 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
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
Sintaxe: CREATE TRIGGER nome tempo evento ON tabela FOR EACH ROW BEGIN END 9
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
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
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
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
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
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