{"id":2313,"date":"2013-08-26T22:34:00","date_gmt":"2013-08-27T00:34:00","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=2313"},"modified":"2017-02-04T14:29:33","modified_gmt":"2017-02-04T16:29:33","slug":"casos-do-dia-a-dia-trigger-para-descobrir-como-um-registro-e-inserido-alterado-e-deletado","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2013\/08\/26\/casos-do-dia-a-dia-trigger-para-descobrir-como-um-registro-e-inserido-alterado-e-deletado\/","title":{"rendered":"Casos do Dia a Dia &#8211; Trigger para descobrir como um registro \u00e9 inserido, alterado e deletado"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>Ap\u00f3s um longo tempo, segue mais um post com um caso do dia a dia que aconteceu comigo.<\/p>\n<p>Onde trabalho, estavam tentando descobrir o que estava alterando dados de uma tabela e como isso estava sendo feito. Uma das formas de fazer isso era criando um trace, contudo, decidi criar uma trigger, visto que essa tabela n\u00e3o tinha muita manipula\u00e7\u00e3o de dados.<\/p>\n<p>Para visualizar o que essa trigger faz, criei as duas tabelas abaixo:<\/p>\n<p>CREATE TABLE TesteTrigger(<br \/>\nId_TesteTrigger int IDENTITY,<br \/>\nDATA datetime<br \/>\n)<\/p>\n<p>CREATE TABLE [dbo].[TesteTrigger_Log](<br \/>\nOperacao VARCHAR(50),<br \/>\nsession_id [smallint] NOT NULL,<br \/>\n[login_name] [nvarchar](128) NOT NULL,<br \/>\nhostname VARCHAR(200),<br \/>\n[start_time] [datetime] NOT NULL,<br \/>\n[program_name] [nvarchar](128) NULL,<br \/>\n[Query] [nvarchar](max) NULL,<br \/>\nId_TesteTrigger [int] NOT NULL &#8212; chave primaria da tabela<br \/>\n) ON [PRIMARY]\n<p>Em seguida, executei o script abaixo para criar a trigger:<\/p>\n<p>CREATE TRIGGER [dbo].[trgTesteTrigger]\nON [dbo].TesteTrigger<br \/>\nFOR UPDATE, DELETE , INSERT<br \/>\nAS<br \/>\nBEGIN<br \/>\nSET NOCOUNT ON;<br \/>\nDECLARE @Id_TesteTrigger INT, @Tp_Alteracao VARCHAR(50)<\/p>\n<p>CREATE TABLE #log(eventtype VARCHAR(MAX),parameters int,text VARCHAR(MAX))<br \/>\nINSERT INTO #log<br \/>\nEXEC(&#8216;DBCC INPUTBUFFER(@@spid)&#8217;)<\/p>\n<p>if not exists(select top 1 null from inserted) &#8211;deleted<br \/>\nbegin<br \/>\nselect @Tp_Alteracao = &#8216;DELETE&#8217;, @Id_TesteTrigger =Id_TesteTrigger<br \/>\nfrom deleted<br \/>\nend<br \/>\nelse if not exists(select top 1 null from deleted) &#8211;inserted<br \/>\nbegin<br \/>\nselect @Tp_Alteracao =&#8217;INSERT&#8217;,@Id_TesteTrigger =Id_TesteTrigger<br \/>\nfrom inserted<br \/>\nend<br \/>\nelse<br \/>\nbegin &#8211;update<br \/>\nselect @Tp_Alteracao =&#8217;UPDATE&#8217;,@Id_TesteTrigger =Id_TesteTrigger<br \/>\nfrom deleted<br \/>\nend<\/p>\n<p>INSERT INTO TesteTrigger_Log(Operacao,session_id,login_name,hostname,start_time, program_name,Query,<br \/>\nId_TesteTrigger)<br \/>\nSELECT @Tp_Alteracao,A.session_id,login_name,host_name,B.start_time, program_name,<br \/>\n(SELECT text FROM #log) QueryAtual,<br \/>\n@Id_TesteTrigger<br \/>\nfrom sys.dm_exec_sessions A<br \/>\nJOIN sys.dm_exec_requests B on A.session_id = B.session_id<br \/>\nJOIN sys.dm_exec_connections C on B.session_id = C.session_id<br \/>\nwhere A.session_id = @@spid<\/p>\n<p>END<\/p>\n<p>Para validar o log gerado pela trigger, basta executar um insert, um update e um delete:<\/p>\n<p>INSERT INTO testetrigger SELECT GETDATE()<\/p>\n<p>UPDATE TesteTrigger SET DATA = GETDATE()-1<\/p>\n<p>DELETE FROM TesteTrigger<\/p>\n<p>Segue abaixo o resultado armazenado pela trigger:<\/p>\n<p><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-2314\" title=\"ResultadoTrigger\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger.png\" alt=\"\" width=\"812\" height=\"83\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger.png 997w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-300x31.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-768x79.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-700x72.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-410x42.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-100x10.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-275x28.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2013\/08\/ResultadoTrigger-20x2.png 20w\" sizes=\"auto, (max-width: 812px) 100vw, 812px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Destaque para os retornos abaixo:<\/p>\n<p>A coluna <strong>Query<\/strong> armazena a query que est\u00e1 realizando a altera\u00e7\u00e3o. Se for uma procedure, aparece o nome da procedure.<\/p>\n<p>A coluna <strong>Program_Name<\/strong> diz se \u00e9 um comando executado do SSMS ou de uma aplica\u00e7\u00e3o.<\/p>\n<p><strong>Id_TesteTrigger<\/strong> \u00e9 o Id do registro alterado.<\/p>\n<p><strong>Hostname<\/strong> \u00e9 de onde o comando foi executado.<\/p>\n<p><span style=\"color: #ff0000;\">obs.: Lembrando que isso n\u00e3o \u00e9 recomendado para uma tabela com uma manipula\u00e7\u00e3o grande de dados.<\/span><\/p>\n<p>Espero ter ajudado.<\/p>\n<p>&nbsp;<\/p>\n<p><b>Gostou dessa Dica?<\/b><\/p>\n<p>Curta, comente, compartilhe\u2026<\/p>\n<p>Assine meu canal no <a href=\"https:\/\/www.youtube.com\/channel\/UCeBRAO_LLrUdSrOXIywjzRA\" target=\"_blank\">Youtube<\/a> e curta minha p\u00e1gina no <a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\" rel=\"nofollow external noopener noreferrer\" data-wpel-link=\"external\">Facebook<\/a> para receber Dicas de Leituras, V\u00eddeos e Eventos sobre SQL Server.<\/p>\n<p>Confira mais experi\u00eancias do Dia a Dia de um DBA no meu <a href=\"https:\/\/www.fabriciolima.net\/cursos-online\/treinamento-tarefas-do-dia-a-dia-de-um-dba-online\/\" target=\"_blank\">Treinamento de Tarefas do Dia a Dia de um DBA<\/a>.<\/p>\n<p>At\u00e9 a pr\u00f3xima.<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Ap\u00f3s um longo tempo, segue mais um post com um caso do dia a dia que aconteceu comigo. Onde trabalho, estavam tentando descobrir o que estava alterando dados de uma tabela e como isso estava sendo feito. Uma das formas de fazer isso era criando um trace, contudo, decidi criar uma trigger, visto [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[3,6,13,33,280],"tags":[959,368,960,962,961,963,33,958],"class_list":["post-2313","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-casos-do-dia-a-dia","category-querys-do-dia-a-dia","category-sql-server","category-virtual-pass-br","tag-auditoria-sql-server","tag-log","tag-log-sql-server","tag-logar-delete","tag-logar-insert","tag-logar-update","tag-sql-server","tag-trigger"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=2313"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2313\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=2313"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=2313"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=2313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}