Triggers

Um Trigger é um bloco de comandos Transact-SQL que é automaticamente executado quando um comando INSERT, DELETE ou UPDATE for executado em uma tabela do banco de dados.

As Triggers são usadas para realizar tarefas relacionadas com validações, restrições de acesso, rotinas de segurança e consistência de dados; desta forma estes controles deixam de ser executados pela aplicação e passam a ser executados pelos Triggers em determinadas situações:

•Quando temos que popular campos de tabelas que estão desatualizados.

•Em uma migração, com certeza envolverá uma trigger que ajude a manter a integridade dos dados.

Em uma situação que temos uma tabela de cliente, que nesta tabela o cliente tem uma coluna IdCliente, e a tabela de pedidos foi criada depois. Mas a única coisa que faz com que a tabela de clientes faça a referência a tabela de pedidos e o cnpj do cliente. Qual a solução que temos pra fazer com que o IdCliente seja gravado na tabela de pedidos, mantendo a integridade dos dados existente ? Trigger isso mesmo, Trigger.

A baixo segue o código da trigger que traz a solução, depois irei explicar o que cada linha de código faz.

Código da trigger.

Create trigger insereIdcliente
On pedido
FOR INSERT
AS
DECLARE @num_error INT
DECLARE @msgerror VARCHAR(255)
UPDATE ped SET ClienteId = cli.IdCliente
FROM pedido ped
JOIN cliente cli
ON ped.cnpjPed9 = cli.cnpj9
AND ped.cnpjPed4 = cli.cnpj4
AND ped.cnpjPed2 = cli.cnpj2
JOIN INSERTED I
ON i.cnpjPed9 = cli.cnpj9
AND i.cnpjPed4 = cli.cnpj4
AND i.cnpjPed2 = cli.cnpj2
SET @num_error = @@error
IF @num_error 0
BEGIN
SET @msgerror = ‘Problemas ao gravar o IdCliente na tabela de pedidos :’ + CONVERT(VARCHAR,ISNULL(@num_error, -1))
RAISERROR (@msgerror, 16, 1)
RETURN
END

Explicando o código.

Crio a trigger insereIdcliente e associo ela á tabela pedido.

Na terceira linha que dizer que toda vez que tiver um comando insert nesta tabela ele fará os procedimentos abaixo.

Como preciso atualizar os dados que já estão inseridos e manter a integridade do mesmo os atualizo usando um UPDATE FROM, usando um JOIN para que os dados entre a tabela pedido e clientes sejam comparados.

No segundo JOIN, faço uma JOIN com a tabela INSERTED. O que é esta tabela?
É que no momento em que a tabela sofre uma INSERT ela é criada, sendo que podemos recuperar os dados inseridos naquele momento.

Assim o JOIN se torna mais eficiente.

Ao fim do código seto a variável @num_error com o valor da variável do sistema @@error, e abaixo um IF para saber se a alteração de dados ocorreu bem, caso contrário seto a variável @msgerror com uma mensagem que o SQL retorna para o usuário.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s