No SQL Server, você pode usar o
CREATE TRIGGER
instrução para criar um gatilho. Um gatilho é um tipo especial de procedimento armazenado que é executado automaticamente quando ocorre um evento no servidor de banco de dados.
Você pode criar um gatilho DML, um gatilho DDL ou um gatilho de logon.
Este artigo fornece um exemplo de criação de um gatilho DML.
O que é um gatilho DML?
Um gatilho DML é um gatilho executado quando um usuário tenta modificar dados por meio de um evento de linguagem de manipulação de dados (DML).
Os eventos DML incluem
INSERT
, UPDATE
, ou DELETE
declarações. Os gatilhos DML podem ser usados para impor regras de negócios e integridade de dados, consultar outras tabelas e incluir instruções T-SQL complexas. O gatilho e a instrução que o aciona são tratados como uma única transação, que pode ser revertida de dentro do gatilho.
Exemplo
Aqui está um exemplo para demonstrar como os gatilhos DML funcionam.
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
Neste exemplo eu crio uma tabela e também crio um gatilho que será acionado sempre que uma linha for inserida ou atualizada naquela tabela.
Nesse caso, o gatilho adiciona 1 ao
c3
coluna sempre que os dados são inseridos ou atualizados. Chamei o gatilho
trg_t1
. Eu segui essa parte com ON t1
, o que significa que o gatilho será executado na tabela chamada t1
. Você pode, alternativamente, especificar uma visualização para o gatilho ser executado, embora você só possa fazer referência a uma visualização por um
INSTEAD OF
gatilho (neste caso, substitua AFTER
com INSTEAD OF
). Além disso, você não pode definir gatilhos DML em tabelas temporárias locais ou globais. AFTER
especifica que o acionador DML é acionado somente quando todas as operações especificadas na instrução SQL de acionamento forem iniciadas com êxito. Você pode, alternativamente, especificar FOR
aqui. Outra alternativa é usar
INSTEAD OF
, que executará o gatilho em vez da instrução SQL de acionamento. Isso, portanto, substitui as ações das instruções de acionamento. Qual é o inserted
Tabela?
No meu gatilho, consigo descobrir qual linha foi atualizada consultando o
inserted
tabela. SQL Server cria e gerencia uma tabela chamada
inserted
, que é uma tabela temporária residente na memória que armazena cópias das linhas afetadas durante INSERT
e UPDATE
declarações. Durante uma transação de inserção ou atualização, novas linhas são adicionadas ao inserted
tabela e a tabela de gatilho. As linhas na tabela inserida são cópias das novas linhas na tabela de gatilhos. O SQL Server também cria e mantém uma tabela semelhante chamada delete, que armazena cópias das linhas afetadas durante
DELETE
e UPDATE
declarações. Durante a execução de um DELETE
ou UPDATE
instrução, as linhas são excluídas da tabela de gatilhos e transferidas para a tabela excluída. Execute o gatilho
Agora que a tabela e seu gatilho foram criados, vamos executar algumas instruções SQL que irão acioná-lo.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Resultado:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Assim, podemos ver que o gatilho funcionou como esperado. Quando inseri uma linha, especifiquei apenas um valor para o
c1
coluna, mas o gatilho garantiu que o c3
coluna também foi atualizada. Observe que o valor padrão para todas as colunas é
0
(conforme especificado quando criei a tabela) e o gatilho adicionou 1 a isso. Vamos realizar um
UPDATE
operação na mesma coluna. UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultado:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Mais uma vez, o
c3
coluna também foi atualizada pelo gatilho. Agora vamos atualizar o
c2
coluna. UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultado:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Então, mais uma vez, o
c3
coluna é atualizada pelo gatilho. Esse gatilho específico é acionado sempre que qualquer outra coluna na mesma linha é atualizada.
Você também pode usar
IF UPDATE(column_name)
para verificar se há uma atualização em uma única coluna, ou COLUMNS_UPDATED()
para verificar atualizações em várias colunas.