Daniel Paulo dptsalvador@hotmail.com. Triggers O SQL Server oferece dois mecanismos primários para...

Post on 07-Apr-2016

226 views 0 download

Transcript of Daniel Paulo dptsalvador@hotmail.com. Triggers O SQL Server oferece dois mecanismos primários para...

Daniel Paulodptsalvador@hotmail.com

TriggersO SQL Server oferece dois mecanismos primários

para reforçar as regras de negócio e a integridade dos dados: CONSTRAINTS e TRIGGERS.

Um trigger, também chamado de gatilho, é um tipo especial de STORED PROCEDURE que automaticamente é disparado quando há um evento de linguagem.

TiposTrigger de DDL - Finalidade de disparar stored

procedures para responder comandos DDL (ALTER, DROP e CREATE)

Trigger de DML - Executa comando a partir dos eventos de INSERT, UPDATE ou DELETE

Trigger de Logon - executado quando um usuário inicia uma sessão

- O acionamento do trigger ocorre de forma automática

- Não envia ou recebe parâmetros- Podem gerar erros com o comando RAISERROR- Tanto o Trigger como o comando que o acionou são

tratados como sendo uma única transação- Esta transação pode ser desfeita em qualquer lugar

de dentro da trigger (ROLLBACK)

Comandos que não podem ser executados por trigger:CREATE DROPDISK (TODOS) GRANTLOAD REVOKEALTER TABLE ALTER DATABASETRUNCATE TABLE UPDATE STATISTICSRECONFIGURE RESTORE DATABASERESTORE LOG SELECT INTO

Diferenças entre triggers e constraints- CONSTRAINT - São proativas, o SQL Server

verifica as regras antes da inserção / alteração dos dados

- TRIGGER - São reativas, o SQL executa o comando e depois verifica se existiu algum erro (caso ocorra realiza um ROLLBACK)

TRIGGER DMLUm trigger DML é uma ação programada para executar

quando um evento DML ocorre em um servidor de banco de dados.

- Podem afetar outras tabelas e pode incluir instruções TSQL complexas

- Podem prevenir operações incorretas ou mal intencionadas de INSERT, UPDATE ou DELETE e fazer restrições mais complexas do que as definidas na CONSTRAINT CHECK

- Podem referenciar outras colunas, ao contrário da constraint CHECK

- Podem avaliar o estado de uma tabela antes e depois de uma modificação dos dados e realizar ações com base nas diferenças entre o estado anterior e posterior à modificação dos dados

- Com resposta à uma instrução de modificação de dados, os trigger localizadas em uma mesma tabela permitem que diferentes ações sejam realizadas

Categorias da trigger DMLTRIGGER AFTER - Especificados somente em tabelas, as

trigger AFTER são executadas após a conclusão das ações de INSERT, UPDATE ou DELETE

Trigger INSTEAD OF - Também conhecidas como BEFORE, são executadas independentemente da transação. São aplicadas também as VIEWS

TRIGGER CLR – Triggers que são construídas com métodos escritos na plataforma .NET

ObservaçõesUm trigger normal na verdade é um trigger AFTER.

Este tipo de trigger acontece junto com a transação que disparou o trigger seja ela um INSERT, UPDATE ou um DELETE. Dentro de um trigger AFTER você pode cancelar a ação utilizando um ROLLBACK. Você somente consegue criar triggers AFTER em tabelas.

 

Tabelas INSERTED e DELETEDO SQL cria em memória uma ou duas tabela

para armazenamento dos dados com os quais a trigger vai trabalhar.

Instrução INSERTED DELETEDINSERT XDELETE XUPDATE Novo Antigo

TRIGGER INSTEAD OFEste trigger é responsável por determinar que o trigger DML seja

executado ao invés do comando SQL ser disparado. Com isso, as ações realizadas por comandos disparados são sobrescritos.

- Apenas 1 trigger por tabela ou view- Não pode ser utilizada com comandos DELETE e UPDATE em

tabelas que possuem relacionamento referencial que determina ações em cascata ON DELETE e ON UPDATE.

 

TRIGGER DDLExecutam Stored Procedures em resposta a um evento DDL- Prevenir certas alterações no esquema do banco de dados,

ou determinar que algo ocorra no banco de dados conforme a alteração sofrida por este esquema

- Registrar alterações ou eventos realizados no esquema do banco de dados

- Iniciar, parar, pausar, modificar e repetir os resultados de trace

- Regular operações de banco de dados- Operam nas instruções CREATE, ALTER e DROP- Os trigger DDL são disparados somente após uma instrução TSQL ter sido

executada- São ferramentas importantes para registrar as ações administrativas do

sistema- Não existe equivalência entre as operações dos Trigger DDL e dos Trigger

INSTEAD OF- Podemos utilizar a instrução ROLLBACK para interromper as transação

atual- Uma única operação DDL pode executar  múltiplos trigger DDL

Visualizando trigger Select name from sys.triggers Object explorer no SSMS Definição da trigger sys.sql_modules 

Trigger aninhadasQualquer trigger pode conter uma instrução UPDATE, INSERT 

ou DELETE que afete uma tabela. Os trigger são aninhados quando um trigger executa uma ação que inicia outra trigger.

- Por padrão, a opção de configuração de um trigger aninhado é ON no nível do servidor

- Aninhamento de até 32 triggers

 

Habilitando e desabilitando trigger aninhados- Ajustar o aninhamento de triggers para a opção nested triggers da stored

procedure sp_configure para 0 EXEC sp_configure 'Nested Triggers' ,  0 - desabilitaEXEC sp_configure 'Nested Triggers' ,  1 - Habilita ouObject Explorerpág 357 

Triggers recursivas: é um trigger que executa uma ação que faz com que o mesmo trigger seja disparado novamente, direta ou indiretamente.

Recursão direta: Ocorre quando um trigger é disparado e executa uma ação na mesma tabela que ela seja disparado novamente

Recursão indireta: Quando um trigger é disparado e executada uma ação que faz com que outro trigger seja disparado na mesma tabela ou em outra e, consequentemente, este trigger causa alteração na tabela original. Essa ação acaba disparando novamente o trigger original.

Alterando TRIGGER- ALTER TRIGGER

Desabilitar um TRIGGER- DISABLE TRIGGER

Habilitar um TRIGGER- ENABLE TRIGGER

Apagar um TRIGGER- DROP TRIGGER

Considerações- O SQL verifica primeiramente as Constraints e depois as

TRIGGERS- Tabelas temporárias ou VIEWS não podem possuir

TRIGGERS- Quando trabalhamos com tabelas que possuem chaves

estrangeiras com uma ação DELETE/UPDATE em cascata, os TRIGGERS dos comandos INSTEAD OF DELETE/UPDATE não podem ser definidos

- Os resultados obtidos após o TRIGGER ter sido disparado são retornados à aplicação que o chamou

- Para não retornar dados utilizar o comando SET NOCOUNT

- O recurso de retornar dados a partir de TRIGGERS será excluído em uma versão futura

- O comando TRUNCATE TABLE não ativa TRIGGERS

Exemplo

Laboratório página 374 à 379