200 likes | 401 Views
Triggers. Renata Viegas. Gatilhos (Triggers). Utilizados para implementar regras de negócio da aplicação Sua principal aplicação é a criação de restrições e consistências de acesso ao banco de dados. Gatilhos (Triggers).
E N D
Triggers Renata Viegas
Gatilhos (Triggers) • Utilizados para implementar regras de negócio da aplicação • Sua principal aplicação é a criação de restrições e consistências de acesso ao banco de dados
Gatilhos (Triggers) • Exemplo: Ao invés de restringir contas com saldos negativos, podemos querer ativar uma ação que automaticamente inicia um empréstimo para aquela conta
Gatilhos (Triggers) • Um trigger é um conjunto de comandos SQL que é automaticamente disparado quando um comando INSERT, UPDATE ou DELETE é executado em uma tabela.
Gatilhos (Triggers) • Um trigger é uma regra do tipo E_C_A: • E: Evento • C: Condição a ser satisfeita na presença do evento E • A: Ação a ser tomada caso a condição C seja satisfeita
Gatilhos (Triggers) • Voltando ao nosso exemplo: • Ao invés de restringir contas com saldos negativos, podemos querer ativar uma ação que automaticamente inicia um empréstimo para aquela conta. • Evento: operação de modificação do saldo • Condição: se saldo < 0 • Ação: Criar um empréstimo para conta
Gatilhos (Triggers) • Composição de um trigger • Um nome: único para cada banco de dados • A maneira: um comando INSERT, UPDATE ou DELETE • As instruções: Um bloco de comandos SQL • Vínculo de um trigger • Os gatilhos (triggers) são sempre vinculados a uma determinada tabela • Quando uma tabela é removida, todos os gatilhos relacionados serão excluídos automaticamente.
Gatilhos no SQL Server • Funcionamento • Quando um trigger é executado, o SQL Server cria duas tabelas temporárias que ficam residentes na memória e existem apenas enquanto o trigger estiver ativo. • As duas tabelas contêm a mesma estrutura da tabela de base onde o trigger foi criado. • Essas duas tabelas recebem o nome de INSERTED e DELETED. • Você pode consultar dados nessa tabela com o SELECT, da mesma forma que uma tabela real
Gatilhos no SQL Server • Funcionamento (cont.) • Quando um comando INSERT é executado, o registro criado será copiado para a tabela de base e para a tabela INSERTED. • Quando um comando UPDATE é executado, o registro original (registro antigo) é armazenado na tabela DELETED e o registro modificado (registro atual) é armazenado na tabela de base e na tabela INSERTED. • Quando um comando DELETE é executado, o registro excluído é armazenado na tabela DELETED.
Gatilhos no SQL Server • Os momentos de disparo são definidos para atuarem quando o respectivo comando de modificação for executado • Um trigger de INSERT não vai ser disparado quando a tabela sofre um UPDATE
Gatilhos (Triggers) • Sintaxe : CREATE TRIGGER<nome> ON <tabela> FOR [INSERT][,][UPDATE][,][DELETE] AS <comandos SQL>
Gatilhos (Triggers) Create Table ExemploTrigger ( Id Int Campo Varchar(10))
Gatilhos (Triggers) CreateTrigger Exemplo On ExemploTriggerFor Insert, Update, DeleteAsBegin If Exists (Select Id From Deleted)BeginIf Exists (Select Id From Inserted)Begin Print 'Foi feito um Update'EndElseBegin Print 'Foi feito um Delete'EndEnd Else Begin Print 'Foi feito um insert'EndEnd
Gatilhos (Triggers) Create Table Estoque (Id Int, Produto Char(10), Qtd Int, QtdMinima Int) Create Table Compras (Id Int, Qtd Int) Create Table Vendas (Id Int, Qtd Int)
Gatilhos (Triggers) • Quando um produto é comprado, acrescenta-se um item do produto no estoque (O estoque é atualizado automaticamente) Create Trigger TrCompras On ComprasFor Insert AsBegin Update Estoque Set Estoque.Qtd = Estoque.Qtd + Inserted.Qtd From Estoque, Inserted Where Inserted.Id = Estoque.IdEnd
Gatilhos (Triggers) • Ao vender um produto, a quantidade em estoque deve ser decrementada. E deve-se comparar com sua quantidade mínima em estoque. CreateTrigger TrVendas On VendasFor Insert AsBeginUpdate Estoque Set Estoque.Qtd = Estoque.Qtd - Inserted.Qtd From Estoque, Inserted Where Inserted.Id = Estoque.IdIf Exists (Select Id From Estoque Where Qtd <= QtdMinima) PRINT 'Existem Produtos em Falta' End
Gatilhos (Triggers) • Voltando ao nosso exemplo: • Ao invés de restringir contas com saldos negativos, podemos querer ativar uma ação que automaticamente inicia um empréstimo para aquela conta. • Crie um Trigger ! conta (numero, titular, saldo) emprestimo (cod_emprestimo, numConta, valor)
Gatilhos (Triggers) createtrigger EmprestimoAuto on Conta ForUpdate as begin If exists (select numero from inserted where saldo <= 0) begin declare @numC int, @valor money Set @numC = (select numero from inserted where saldo <= 0) Set @valor = (select d.saldo + i.saldo from inserted i, deleted d) insert into emprestimo values (1, @numC, @valor) print 'Foi feito um emprestimo automático' end end
Gatilhos (Triggers) • Observações importantes • Triggers não podem ser criadas para Visões ou tabelas temporárias • Triggers não possuem parâmetros e não podem ser explicitamente invocados. • São disparados quando os dados da “tabela protegida” são modificados • Triggers são considerados como parte de uma transação • Se houver falha no seu funcionamento, os comandos serão revertidos (ROLLBACK)
Gatilhos no SQL Server • Detalhe… • No SQL Server, os trigger são disparados após um INSERT, UPDATE ou DELETE • Conclusão: não existe o momento BEFORE nem AFTER