O trigger (gatilho) é um tipo de procedimento armazenado especial, que será executado sempre que houver uma tentativa de modificação dos dados de uma tabela protegida por ele. Os gatilhos DML (Data Manipulation Language – INSERT, UPDATE, DELETE) podem ser usados para impor regras, verificar a integridade de dados, consultar outras tabelas e incluir instruções Transact-SQL complexas.
O trigger será chamado automaticamente sempre que houver uma tentativa de inserir, atualizar ou excluir dados de uma tabela, não podendo nunca ser ignorado. Ao contrário dos procedimentos armazenados (stored procedures), os triggers não podem ser executados diretamente e não enviam nem recebem parâmetros.
Um trigger pode conter uma instrução ROLLBACK TRANSACTION, mesmo que não exista uma instrução explícita de BEGIN TRANSACTION; neste caso, toda a transação (o trigger e a instrução que o disparou) será revertida ou desfeita.
Os triggers sempre serão executados após a utilização de comando INSERT, UPDATE ou DELETE. Neste artigo, veremos um exemplo do trigger INSERT.
Trigger INSERT
Um trigger INSERT pode enviar mensagens de erro ou sucesso, ou ainda executar determinadas funções, de acordo com as transações criadas. Essas ações podem ser definidas em um trigger através de condicionais IF, sendo assim possível verificar se a operação foi executada com sucesso. No exemplo, será criada uma tabela chamada tbl_teste, onde será simulado um cadastro de usuários. A cada inserção de novo usuário, será escrita uma mensagem de confirmação e a hora e data que o registro atual foi inserido, confirmando o sucesso ou não da operação.
Instruções de triggers DML também podem utilizar duas tabelas especiais: a tabela Deleted e a tabela Inserted. O próprio SQL Server é reponsável por criar e gerenciar automaticamente essas tabelas, sendo possível usá-las para testar os efeitos de algumas modificações de dados. A tabela Inserted armazena cópias das linhas afetadas durante as instruções INSERT e UPDATE. Durante uma transação de inserção ou atualização, novas linhas são adicionadas à tabela Inserted.
Criação das tabelas:
(
user_cpf int not null primary key,
user_name varchar(128) not null,
user_email varchar(128) not null
)
GOCREATE TABLE Status_tbl
(
Field1 varchar(128) not null,
Date_Time datetime
)
GO
Criação do trigger:
CREATE TRIGGER onInsertValue ON tbl_teste
FOR INSERT AS
IF (SELECT COUNT(*) FROM INSERTED) = 1
INSERT INTO Status_tbl
(
Field1,
Date_Time
)
VALUES
(‘Record inserted successfully’, CURRENT_TIMESTAMP)
GO
A cada registro inserido com sucesso, o SGBD realizará a escrita em uma tabela auxiliar chamada Status_tbl. A partir desta tabela auxiliar, pode-se tratar os registros no E3, confirmando se os valores foram realmente inseridos na tabela principal.
Inserindo valores na tabela a partir do SQL Management Studio:
Para verificar se o INSERT foi realizado no banco de dados, é possível criar uma consulta no E3 que retorne o último registro inserido na tabela Status_tbl. A sintaxe da consulta deve ser a seguinte:
FROM Status_tbl
ORDER BY Status_tbl.Date_TimeDESC
A cada escrita realizada com sucesso na tabela (através do método WriteRecord do histórico ou do comando Insert Into), serão retornados os campos da tabela Status_tbl com uma mensagem e horário do último INSERT, conforme definido no trigger:
O banco de dados utilizado neste artigo foi o Microsoft SQL Server 2012.
Artigos Relacionados
- Linguagem SQL: Introdução.
- Linguagem SQL: Capítulo 1 – Tipos de Manipulação de Informações no BD.
- Linguagem SQL: Capítulo 2 – Arquivos e Logs do Banco de Dados SQL Server.
- Linguagem SQL: Capítulo 3 – Descarte de Dados e Limite dos Bancos.
- Linguagem SQL: Capítulo 4 – Backup.
- Linguagem SQL: Capítulo 5 – Boas práticas de configuração de um Histórico e uma Consulta.
- Linguagem SQL: Capítulo 6 – Comandos SQL.
- Linguagem SQL: Capítulo 7 – Views.
- Linguagem SQL: Capítulo 9 – Stored Procedures.