Vous êtes sur la page 1sur 27

FTC Faculdade de Tecnologia e Cincias Sistemas de Informao V Semestre

Aula IV Functions e Triggers no MYSQL

Rafael Neiva rafael@prodados.inf.br

Functions
CREATE FUNCTION sp_name ([parameter[,...]]) [RETURNS type] [characteristic ...] begin return varivel end
parameter: [ IN | OUT | INOUT ] param_name type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | SQL SECURITY {DEFINER | INVOKER} | COMMENT string

Functions
A clusula RETURNS pode ser especificada apenas por uma FUNCTION. usada para indicar o tipo de retorno da funo, e o corpo da funo deve conter uma instruo RETURN value.

Caractersticas
Uma funo considerada ``deterministica'' se ela sempre retorna o mesmo resultado para os mesmos parmetros de entrada, e no deterministica'' caso contrrio.

Caractersticas
A caracterstica SQL SECURITY pode ser usada para especificar se a rotina deve ser executada usando as permisses do usurio que criou a rotina, ou o usurio que a chamou

Exemplo
create function getNivelString(nivel INT) returns varchar(45) begin declare nivelString varchar(45); case nivel when 0 then nivelString = 'comum' when 1 then nivelString = 'colaborador' when 2 then nivelString = 'moderador' when 3 then nivelString = 'administrador' else nivelString = 'comum' end; return nivelString; end

Exemplo pratico Function


CREATE TABLE notas(aluno VARCHAR(10), nota1 INT, nota2 INT, nota3 INT, nota4 INT); INSERT INTO notas VALUES('Maria', 10, 9, 10, 10); INSERT INTO notas VALUES('Pedro', 5, 2, 3, 4);

Criar uma funo pra calcular a mdia do aluno


CREATE FUNCTION media (nome VARCHAR(10)) RETURNS FLOAT DETERMINISTIC BEGIN DECLARE n1,n2,n3,n4 INT; DECLARE med FLOAT; SELECT nota1,nota2,nota3,nota4 INTO n1,n2,n3,n4 FROM notas WHERE aluno = nome; SET med = (n1+n2+n3+n4)/4; RETURN med; END

Alterar e Excluir SP e Functions


Alterao ALTER PROCEDURE | FUNCTION sp_name ... Excluso DROP PROCEDURE | FUNCTION [IF EXISTS] sp_name

Trigger
Um TRIGGER ou gatilho um objeto de banco de dados, associado a uma tabela, definido para ser disparado, respondendo a um evento em particular Tais eventos so os comandos da DML (Data Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE.

Triggers
Podemos definir inmeros TRIGGERS em uma base de dados baseados diretamente em qual dos comandos acima ir dispar-lo, sendo que, para cada um, podemos definir apenas um TRIGGER Os TRIGGERS podero ser disparados para trabalharem antes ou depois do evento

Vantagens de utilizar Trigger


fornecem uma forma alternativa para verificar a integridade podem detectar, minimizar ou eliminar os erros de lgica na base de dados fornecem uma forma alternativa de executar tarefas agendadas. voc no tem que esperar para executar as tarefas agendadas. Voc pode lidar com essas tarefas antes ou aps as alteraes feitas nas tabelas da base de dados. so muito teis para auditar mudanas de dados numa tabela da base de dados

Desvantagens
pode apenas fornecer validao estendida, no pode substituir todas as validaes. Algumas validaes simples podem ser feitas no nvel de aplicativo. Por exemplo,voc pode validar ou verificar a entrada no lado cliente usando JavaScript ou no lado do servidor pelo script de servidor utilizando PHP ou ASP.NET. executam de forma invisvel a relao clienteservidor assim difcil descobrir o que aconteceu na camada de base de dados subjacente

Importante
No permitido chamar um stored procedure em um trigger. No permitido criar um trigger para uma view ou a tabela temporria. No permitido o uso de transaes (commit e roolback) num trigger. A declarao de retorno (return) no permitida num trigger. Criar um trigger para uma tabela da base de dados faz com que o cache de consultas seja invalidado Todos os triggers para uma tabela da base de dados deve ter nome nico.

Estrutura Trigger
CREATE [DEFINER = { USER | CURRENT_USE } ] TRIGGER trigger_name trigger_time trigger_event On tbl_name FOR EACH ROW trigger_stmt

Estrutura Trigger
DEFINER: Quando o TRIGGER for disparado, esta opo ser checada para checar com quais privilgios este ser disparado. trigger_name: define o nome do procedimento, por exemplo, trg_test; trigger_time: define se o TRIGGER ser ativado antes (BEFORE) ou depois (AFTER) do comando que o disparou; trigger_event: aqui se define qual ser o evento, INSERT, REPLACE, DELETE ou UPDATE; tbl_name: nome da tabela onde o TRIGGER ficar pendurado aguardando o trigger_event; trigger_stmt: as definies do que o TRIGGER dever fazer quando for disparado.

Definir Dados de OLD(antes) e NEW(depois)


Em meio aos TRIGGERS temos dois operadores importantssimos que nos possibilitam acessar as colunas da tabela alvo do comando DML, podemos acessar os valores que sero enviados para a tabela antes (BEFORE) ou depois (AFTER) de um UPDATE,

Definir Dados de OLD(antes) e NEW(depois)


INSERT: o operador NEW.nome_coluna, nos permite verificar o valor enviado para ser inserido em uma coluna de uma tabela. OLD.nome_coluna no est disponvel. DELETE: o operador OLD.nome_coluna nos permite verificar o valor excludo ou a ser excludo. NEW.nome_coluna no est disponvel. UPDATE: tanto OLD.nome_coluna quanto NEW.nome_coluna esto disponveis, antes (BEFORE) ou depois (AFTER) da atualizao de uma linha.

Exemplo Trigger
DELIMITER | CREATE TRIGGER exclui_tickets AFTER DELETE ON USUARIOS FOR EACH ROW BEGIN DELETE FROM TICKETS WHERE id_usuario = OLD.id_usuario; END| DELIMITER ;

Exemplo Prtico Trigger


Criao da tabela de funcionrio CREATE TABLE `FUNCIONARIO`( `codFuncionario` int(11) not null, `nome` varchar(50) not null, `sobrenome` varchar(50) not null, `funcao` varchar(50) not null, PRIMARY KEY (`cod_funcionario`) );

Exemplo prtico Trigger


Sempre que o registro do funcionrio mudar, guardar as informaes em outra tabela CREATE TABLE `FUNCIONARIO_AUDITORIA`( `id` int(11) not null AUTO_INCREMENT, `codFuncionario` int(11) not null, `nome` varchar(50) not null, `data` datetime default null, `acao` varchar(50) default null, PRIMARY KEY (`id`) );

Exemplo prtico Trigger


Criaremos uma trigger que ser acionada sempre que atualizar a tabela de funcionrios DELIMITER $$ CREATE TRIGGER ` apos_atualizar` BEFORE UPDATE ON `funcionario` FOR EACH ROW begin INSERT INTO `funcionario_auditoria` set acao = 'update', cod_funcionario = OLD.cod_funcionario, nome = OLD.nome; END $$ DELIMITER ;

Exemplo prtico Trigger


Povoando a tabela funcionario INSERT INTO funcionario VALUES (1,'Nasair','teste','professor'); Testando a Trigger
Update funcionario Set nome = 'rafael'; Where codFuncionario = 1;

Verificando a operao feita


Select * from funcionario;

Administrar Triggers Mysql


Verificar informaes da Trigger associado a uma base de dados e pelo nome da trigger select * from Information_schema.TRIGGERS WHERE Trigger_schema = nome_banco' and Trigger_name = nome_trigger';

Administrar Triggers Mysql


Verificar informaes da Trigger associado a uma base de dados e a uma tabela select * from Information_schema.TRIGGERS WHERE Trigger_schema = nome_banco' and Event_object_table = nome_tabela';

Administrar Triggers Mysql


Ver todas as Triggers Show triggers;

Deletar Trigger
Drop trigger <nome_trigger>