FACULDADE INGÁ Unidade de Ensino Superior Ingá Ltda Ciência da Computação Linguagem SQL Restrições, Triggers e Views Prof. Erinaldo Sanches Nascimento
Objetivos Especificar restrições mais gerais sobre o banco de dados. Especificar regras ativas Definir views (visões) no banco de dados.
Especificar Restrições CREATE TRIGGER Especifica ações automáticas que o sistema de banco de dados realizará quando certos eventos e condições ocorrerem.
Triggers objeto de dados associado a uma tabela é ativado quando ocorre um evento específico para a tabela executam verificações de valores a serem inseridos em uma tabela realizam cálculos sobre os valores envolvidos em uma atualização
Está associado a uma instrução para inserir, atualizar ou excluir linhas da tabela. Um disparo pode ser programado para ser ativado antes ou depois do evento de disparo.
Sintaxe Para criar uma trigger: CREATE TRIGGER Para eliminar uma trigger: DROP TRIGGER
CREATE [DEFINER = { user CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time: { BEFORE AFTER } trigger_event: { INSERT UPDATE DELETE }
Cria uma nova trigger. A trigger fica associado com a tabela tbl_name. Não pode associar uma trigger a uma tabela temporária ou uma visão. Todas as triggers devem ter nomes exclusivos em um esquema. Triggers em esquemas diferentes podem ter o mesmo nome.
CREATE TRIGGER requer o privilégio TRIGGER para a tabela associada. A declaração também pode exigir o privilégio SUPER, dependendo do valor DEFINER. Se o log binário estiver habilitado, CREATE TRIGGER pode exigir o privilégio SUPER. A cláusula DEFINER determina o contexto de segurança para ser utilizado ao verificar os privilégios de acesso no momento da ativação da trigger.
trigger_time é o tempo de ação do gatilho. Pode ser BEFORE ou AFTER, para indicar antes ou depois de cada linha ser modificado. trigger_event indica o tipo de operação que ativa o gatilho. INSERT: através de INSERT, LOAD DATA, e REPLACE. UPDATE: através de instruções UPDATE. DELETE: através de declarações DELETE e REPLACE.
O trigger_event não representa um tipo literal de instrução SQL que aciona o gatilho representa um tipo de operação de tabela. Ações de chave estrangeira em cascata não ativam os gatilhos. Não pode haver vários gatilhos para uma determinada tabela que tem o mesmo evento de disparo e tempo de ação. É possível ter um gatilho BEFORE UPDATE e um BEFORE INSERT, ou um gatilho BEFORE INSERT e um AFTER UPDATE.
trigger_body é a instrução a ser executada quando o gatilho é ativado. A construção BEGIN...END executa múltiplos comandos. O alias OLD.col_name refere-se a uma coluna de uma linha existente antes de ser atualizada ou excluída. NEW.col_name refere-se à coluna de uma nova linha a ser inserida ou uma linha existente depois de atualizada.
A cláusula DEFINER especifica a conta MySQL para ser usada ao verificar os privilégios de acesso no gatilho o tempo de ativação. Se um valor de usuário é dado, deve ser uma conta MySQL especificada como 'user_name ' @ ' host_name ' (o mesmo formato usado na instrução GRANT ), CURRENT_USER, ou CURRENT_USER (). O valor DEFINER padrão é o usuário que executa a instrução CREATE TRIGGER. O mesmo que especificar DEFINER = CURRENT_USER explicitamente. Essas regras determinam os valores de usuário válidos: Sem o privilégio SUPER, o único valor usuário permitida é o da própria conta, ou especificados literalmente ou usando CURRENT_USER. Com o privilégio SUPER pode especificar qualquer nome de conta sintaticamente válido. Embora seja possível, não é uma boa idéia criar um gatilho com uma conta DEFINER inexistente
MySQL leva o usuário DEFINER em conta quando verifica privilégios de gatilho: Na hora do CREATE TRIGGER, o usuário que emite a declaração deve ter o privilégio TRIGGER. No momento de ativação de gatilho, os privilégios são verificadas em relação ao usuário DEFINER. Este usuário deve ter esses privilégios: O privilégio TRIGGER. O privilégio SELECT. O privilégio UPDATE. Quaisquer outros privilégios são normalmente necessários para as instruções executadas pelo gatilho.
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name Exclui um gatilho. O nome do esquema (banco de dados) é opcional. DROP TRIGGER requer o privilégio TRIGGER para a tabela associada com o gatilho. IF EXISTS previne ocorrer um erro por um gatilho que não existe. Gatilhos de uma tabela também são descartados se você descartar a tabela.
Exemplo Exemplo de gatilho que funciona como um acumulador, somando os valores inseridos em uma das colunas da tabela. CREATE TABLE conta (nconta INT, valor DECIMAL(10,2)); CREATE TRIGGER ins_soma BEFORE INSERT ON conta FOR EACH ROW SET @soma = @soma + NEW.valor; SET @soma = 0; INSERT INTO conta VALUES(137,14.98), (141,1937.50),(97,-100.00); SELECT @soma AS 'Montante total inserido';
Para destruir a trigger, use uma instrução DROP TRIGGER. Lembre-se de especificar o nome do esquema se o gatilho não está no esquema padrão. DROP TRIGGER mydb.ins_soma;
Um trigger UPDATE que verifica o novo valor a ser utilizado a cada linha, e modifica o valor para estar dentro do intervalo de 0 a 100. delimiter // CREATE TRIGGER upd_check BEFORE UPDATE ON conta FOR EACH ROW BEGIN END;// delimiter ; IF NEW.valor < 0 THEN SET NEW.valor = 0; ELSEIF NEW.valor > 100 THEN END IF; SET NEW.valor = 100;
Exercícios 1. Crie a tabela que será utilizada: create table clientes( idcliente int unsigned auto_increment primary key, nomecliente char(80) not null, emailcliente char(80) not null, datacadastro timestamp default current_timestamp ) Engine = InnoDB;
2. Crie um trigger que, após a inserção, valide a quantidade de caracteres do nomecliente maior ou igual a 4 (quatro). Caso seja menor atribui-lhe null. 3. Insira uma nova cliente chamada Tina. 4. Insira um novo cliente chamado Wagner. 5. Crie uma tabela produtos.
6. Crie a tabela compras. 7.