Back-End

17 mar, 2008

Triggers em Transact – SQL

Publicidade

Assim como um gatilho dispara um projétil de uma arma para que este possa acertar o seu alvo, da mesma maneira um trigger dispara uma série de ações para cumprir um objetivo específico.

Muitas pessoas possuem dúvidas de como fazer tais disparos de ações em uma base de dados.

Em vista desta necessidade, nessa matéria veremos o conceito de triggers e como criá-los baseado no Transact-SQL.

Um trigger é automaticamente executado quando um comando do tipo INSERT, DELETE ou UPDATE é executado em uma tabela.

A principal aplicação de uma trigger é a criação de restrições de acesso ao banco de dados, como rotinas de segurança.

Em vez de deixarmos o controle da aplicação para a própria tabela, passamos a executar por meio de triggers, ou gatilhos, esses controles, tornando muito mais seguro o manuseio de nossa base de dados.

Entre as várias utilidades de um trigger, podemos destacar:

  • Criar mecanismos de validação, os quais envolvam pesquisas em mais de uma tabela;
  • Inserir o conteúdo de uma coluna derivada de outras colunas;
  • Atualizar outras tabelas em função de inclusão ou alteração de dados da tabela que estamos utilizando;
  • Criação de logs, ou registros de inclusão e alterações de usuários.

Há outras aplicações que podemos fazer com triggers, isso depende da necessidade do desenvolvedor ou DBA.

Devemos ter em mente dois importantes aspectos de um trigger:

Primeiramente que a ação executada pelo trigger é o bloco Transact-SQL que criamos e que um trigger pode ser acionado pelos comandos INSERT, DELETE e UPDATE além de poder ser chamado quando mais de uma ação ocorrer;

Limitações do uso de um trigger

  • Um trigger pode executar comandos contidos em seu corpo ou acionar uma stored procedure e outros triggers para executar determinadas tarefas;
  • Pode-se especificar qualquer comando SET dentro de um trigger.
  • Ele permanecerá ativo durante toda a execução do trigger;
  • Não é possível criar um trigger para uma visão. Porém, quando uma visão é utilizada, os triggers da tabela que está sendo utilizada são normalmente acionados;
  • Quando um trigger é executado os resultados são retornados para a aplicação que o chamou.
  • Para evitar o retorno de resultados, recomenda-se não utilizar comandos SELECT que retornem resultados ou que executem a atribuição de conteúdo a variáveis.
  • O comando TRUNCATE TABLE não consegue ser interceptado por um trigger do tipo DELETE.
  • O comando WRITETEXT não ativa um trigger;

Há também certos comandos Trasact-SQL que não podem ser utilizados dentro de um trigger como, por exemplo: ALTER DATABASE, ALTER PROCEDURE, CREATE DATABASE, CREATE INDEX, DROP DATABASE, DROP PROCEDURE, entre outros.

Criando um trigger

Um trigger pode ser criado com o uso do Transact-SQL CREATE TRIGGER, ou por meio do enterprise manager.

Nos dois casos é necessária a digitação dos comandos SQL.

Exemplo de criação de um trigger:

CREATE TRIGGER nome_do_trigger

ON { table | view }

[ WITH ENCRYPTION ]

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

[ { IF UPDATE ( column )

[ { AND | OR } UPDATE ( column ) ]

[ …n ]

| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )

{ comparison_operator } column_bitmask [ …n ]

} ]

sql_statement [ …n ]

}

}

Onde:

ON – Indica a tabela ou visão para o qual o trigger está sendo criado;

FOR – Deve ser seguido do tipo de comando ou comandos que disparam o trigger;

AFTER – Especifica que o trigger é disparado apenas quando todas as operações especificadas no comando de disparo forem executadas com sucesso. Todas as ações contraints devem ter sido bem sucedidas antes de o trigger ser executado. AFTER é padrão se apenas FOR for especificado.Os triggers do tipo AFTER não pode ser definidos em visões;

INSTEAD OFF – Especifica que o trigger é executado em vez do comando de disparo desse trigger, ou seja, em vez do comando INSERT, o trigger será executado. Podem existir triggers INSTEAD OF para cada comando INSERT, UPDATE.

Os triggers INSTEAD OF não são permitidos em visões com a opção WITH CHECK OPTION.

Exemplo prático de um trigger

Neste exemplo imagine que possuímos uma tabela onde ficam armazenados artigos.

A cada alteração feita na tabela imprimirá uma mensagem na tela ‘Artigo alterado com sucesso!’.

CREATE TRIGGER TRG_Artigos

ON Artigos

FOR INSERT, UPDATE

AS PRINT(‘Artigo alterado com sucesso!’)

GO

Para alterar um trigger usamos o comando ALTER TRIGGER nome_do_trigger.

Para excluir um trigger utilizamos o comando DROP TRIGGER nome_do_trigger.

Lembrando que se a tabela que contém o trigger for eliminada o trigger também será.

Bem, espero ter ajudado àqueles que têm interesse no assunto, ou que sentem a necessidade deste tipo de funcionalidade.

Caso tenha dúvidas ou sugestões mail-me ou deixem seus comentários aqui ou no meu blog (www.thiagocaserta.blogspot.com).

Até a próxima!