FTC Faculdade de Tecnologia e Cincias Sistemas de Informao V Semestre
Aula IV Functions e Triggers no MYSQL
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>