{"id":20406041,"url":"https://github.com/miguelhp373/triggerssqlserverexample","last_synced_at":"2025-03-05T02:19:08.194Z","repository":{"id":160153201,"uuid":"430151330","full_name":"miguelhp373/TriggersSqlServerExample","owner":"miguelhp373","description":"Exemplo Retirado da DevMedia","archived":false,"fork":false,"pushed_at":"2021-11-20T16:26:57.000Z","size":22,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-15T12:14:35.381Z","etag":null,"topics":["devmedia","sqlserver","triggers","tsql"],"latest_commit_sha":null,"homepage":"https://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/miguelhp373.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-20T16:21:39.000Z","updated_at":"2021-11-20T16:28:02.000Z","dependencies_parsed_at":"2023-07-06T23:16:51.440Z","dependency_job_id":null,"html_url":"https://github.com/miguelhp373/TriggersSqlServerExample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelhp373%2FTriggersSqlServerExample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelhp373%2FTriggersSqlServerExample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelhp373%2FTriggersSqlServerExample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelhp373%2FTriggersSqlServerExample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/miguelhp373","download_url":"https://codeload.github.com/miguelhp373/TriggersSqlServerExample/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241950402,"owners_count":20047634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devmedia","sqlserver","triggers","tsql"],"created_at":"2024-11-15T05:14:25.923Z","updated_at":"2025-03-05T02:19:08.182Z","avatar_url":"https://github.com/miguelhp373.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Triggers SQL Server\n\nMiguel Henrique Pereira - 3M - Banco de Dados 3\n\n---\n\n# Introdução\n\nMuitas vezes, quando desenvolvemos aplicações com acesso a bancos de dados, utilizamos estes apenas como depósito de informações, sem explorar completamente os recursos que eles nos oferecem.\n\nAlguns SGBDs (Sistemas Gerenciadores de Bancos de Dados) dispõem de diversas funcionalidades que, se utilizadas corretamente, podem trazer diversos benefícios, tais como:\n\n- Maior facilidade na manutenção do sistema depois de implantando em ambiente de produção;\n- Ganho de desempenho, quando o banco de dados encontra-se em um servidor com boa capacidade de hardware;\n- Possibilidade de maior atuação de um DBA (Administrador de Banco de Dados) no desenvolvimento e manutenção do sistema;\n\n**Os triggers são um ótimo exemplo desse tipo de funcionalidade que nem sempre é aproveitado pelos desenvolvedores**, muitas vezes por não conhecerem ou entenderem o funcionamento dessas estruturas ou por dificuldade com a programação no banco de dados (no caso do SQL Server, utilizando a chamada T-SQL).\n\n# O Que é?\n\nO termo trigger (gatilho em inglês) define uma estrutura do banco de dados que funciona, como o nome sugere, como uma função que é disparada mediante alguma ação. Geralmente essas ações que disparam os triggers são alterações nas tabelas por meio de operações de inserção, exclusão e atualização de dados (insert, delete e update).\n\nUm gatilho está intimamente relacionado a uma tabela, sempre que uma dessas ações é efetuada sobre essa tabela, é possível dispará-lo para executar alguma tarefa.\n\nNeste artigo veremos como trabalhar com triggers no SQL Server, através de um exemplo que simula uma situação real, para facilitar o entendimento.\n\n# Estrutura No SQL Server:\n\n```sql\nCREATE TRIGGER [NOME DO TRIGGER]\nON [NOME DA TABELA]\n[FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE]\nAS\n    --CORPO DO TRIGGER\n```\n\nOs parâmetros são:\n\n- NOME DO TRIGGER: nome que identificará o gatilho como objeto do banco de dados. Deve seguir as regras básicas de nomenclatura de objetos.\n- NOME DA TABELA: tabela à qual o gatilho estará ligado, para ser disparado mediante ações de insert, update ou delete.\n- FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em que o trigger será disparado. FOR é o valor padrão e faz com o que o gatilho seja disparado junto da ação. AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída. INSTEAD OF faz com que o trigger seja executado no lugar da ação que o gerou.\n- INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser indicadas para informar ao banco qual é a ação que disparará o gatilho. Por exemplo, se o trigger deve ser disparado após toda inserção, deve-se utilizar AFTER INSERT.\n\nO entendimento de toda essa sintaxe, bem como do funcionamento dos triggers será facilitado quando desenvolvermos um exemplo próximo de um cenário real, conforme faremos a seguir.\n\n# Exemplo:\n\n```sql\nCREATE TABLE CAIXA\n(\n    DATA            DATETIME,\n    SALDO_INICIAL   DECIMAL(10,2),\n    SALDO_FINAL     DECIMAL(10,2)\n)\nGO\n\nINSERT INTO CAIXA\nVALUES (CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 103)), 100, 100)\nGO\n\nCREATE TABLE VENDAS\n(\n    DATA    DATETIME,\n    CODIGO  INT,\n    VALOR   DECIMAL(10,2)\n)\nGO\n```\n\nPor lógica, o saldo final do caixa começa igual ao saldo inicial.\n\nCriemos então o primeiro trigger sobre a tabela de vendas, que reduzirá o saldo final do caixa na data da venda quando uma venda for inserida.\n\n```sql\nCREATE TRIGGER TGR_VENDAS_AI\nON VENDAS\nFOR INSERT\nAS\nBEGIN\n    DECLARE\n    @VALOR  DECIMAL(10,2),\n    @DATA   DATETIME\n\n    SELECT @DATA = DATA, @VALOR = VALOR FROM INSERTED\n\n    UPDATE CAIXA SET SALDO_FINAL = SALDO_FINAL + @VALOR\n    WHERE DATA = @DATA\nEND\nGO\n```\n\nNesse trigger utilizamos uma tabela temporária chamada INSERTED. Essa tabela existe somente dentro do trigger e possui apenas uma linha, contendo os dados do registro que acabou de ser incluído. Assim, fazemos um select sobre essa tabela e passamos o valores de suas colunas para duas variáveis internas, @VALOR e @DATA, que são utilizadas posteriormente para realizar o update na tabela de caixa.\n\nO que fazemos é atualizar o saldo final da tabela caixa, somando o valor da venda cadastrada, no registro cuja data seja igual à data da venda (lógica de negócio simples).\n\nComo sabemos que o saldo final da tabela caixa encontra-se com o valor 100,00, podemos testar o trigger inserindo um registro na tabela vendas. Vamos então executar a seguinte instrução **[SQL](https://www.devmedia.com.br/guia/guia-de-referencia-sql/38314)** e observar seu resultado.\n\n```sql\nINSERT INTO VENDAS\nVALUES (CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 103)), 1, 10)\n```\n\nInserimos uma venda com a data atual, o código 1 e o valor 10,00. Seguindo a lógica definida, o saldo final do caixa agora deverá ser 110,00.\n\nPodemos conferir isso executando um select sobre a tabela CAIXA e observando o resultado, conforme ilustra a **Figura 1**.\n\n![Untitled](.github/Untitled.png)\n\nAgora precisamos criar um trigger para a instrução de delete, que devolverá o valor ao caixa quando uma venda for excluída.\n\n```sql\nCREATE TRIGGER TGR_VENDAS_AD\nON VENDAS\nFOR DELETE\nAS\nBEGIN\n    DECLARE\n    @VALOR  DECIMAL(10,2),\n    @DATA   DATETIME\n\n    SELECT @DATA = DATA, @VALOR = VALOR FROM DELETED\n\n    UPDATE CAIXA SET SALDO_FINAL = SALDO_FINAL - @VALOR\n    WHERE DATA = @DATA\nEND\nGO\n```\n\nDessa vez utilizamos a tabela temporária DELETED, que funciona da mesma forma que a INSERTED já citada, porém com os dados do registro que está sendo excluído, em operações de delete e update.\n\nPodemos agora excluir o registro da tabela VENDAS e verificar como o saldo do caixa é atualizado (deve voltar ao valor 100,00, devido ao cancelamento da venda de 10,00).\n\n```sql\nDELETE FROM VENDAS WHERE CODIGO = 1\nGO\n```\n\nListando os registros da tabela CAIXA podemos ver que o saldo final foi atualizado, tendo sido subtraído dele o valor 10,00, conforme esperado (Figura 2).\n\n![Untitled](.github/Untitled%201.png)\n\n# **Conclusão**\n\nCom este exemplo bastante simples é possível perceber um ponto muito importante da utilização de triggers para automatização de certas ações. Por exemplo, o programador responsável por esta parte do sistema poderia optar, antes de ler este artigo, por atualizar a tabela de caixa manualmente após cada operação na tabela vendas, utilizando sua linguagem de programação de preferência. Agora, ele apenas precisará se preocupar com o registro e cancelamento da venda, pois a atualização da tabela de caixa será feita automaticamente pelo próprio banco de dados.\n\nCom isso, o sistema em si, ou seja, o aplicativo, tende a ficar mais leve, pois parte da responsabilidade de execução de algumas tarefas foi transferida para o servidor de banco de dados.\n\nApesar de breve, este artigo buscou apresentar os principais pontos sobre o uso de triggers no SQL Server, apresentando um exemplo prático bastante próximo a uma situação real, com o objetivo de facilitar o entendimento.\n\nCaso surjam dúvidas, críticas ou sugestões, a seção de comentários está aberta logo abaixo.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelhp373%2Ftriggerssqlserverexample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiguelhp373%2Ftriggerssqlserverexample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelhp373%2Ftriggerssqlserverexample/lists"}