{"id":8,"date":"2011-01-14T15:46:16","date_gmt":"2011-01-14T15:46:16","guid":{"rendered":"http:\/\/rodrigorrg.wordpress.com\/?p=8"},"modified":"2011-01-14T15:46:16","modified_gmt":"2011-01-14T15:46:16","slug":"quando-uma-sys-algo-pode-te-ajudar","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2011\/01\/14\/quando-uma-sys-algo-pode-te-ajudar\/","title":{"rendered":"Quando uma sys.algo pode te ajudar"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Muito \u00fatil!\" data-post-id=\"8\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de Leitura:<\/span> <span class=\"rt-time\"> 3<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>Bom galera, resolvi passar por aki, aproveitando que estou na hora do rango!<\/p>\n<p>Aqui onde trabalho, estava acontecendo um erro em um dos servidores de teste quando alguem tentava logar no site que temos, tudo em ambiente de teste. A p\u00e1gina era(\u00e9) uma p\u00e1gina ASP.<br \/>\nO erro era esse:<\/p>\n<blockquote><p>Microsoft OLE DB Provider for ODBC Drivers error &#8216;80004005&#8217;<\/p>\n[Microsoft][ODBC SQL Server Driver][SQL Server]Logon failed for login &#8216;XXXXYYYYYYY&#8217; due to trigger execution.<span style=\"font-style:normal;\">[&#8230;]<\/span><\/p><\/blockquote>\n<p>XXXXYYYYYYY \u00e9 o login que o IIS se usa pra se conectar no SQL Server.\u00a0Se olharmos para o final vemos a frase &#8220;<strong>due to trigger execution&#8221;<\/strong>, em outras palavras ( <em>literalmente <\/em>), &#8220;<strong>devido a execucao de uma trigger&#8221;<\/strong>.\u00a0Na minha <del>&#8220;<em>longa<\/em>&#8220;<\/del> vida de SQL, eu vi que esse tipo de erro acontence quando temos triggers de <a title=\"Logon Triggers ( BOL )\" href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb326598(SQL.90).aspx\" target=\"_blank\">Logon <\/a>( que sao na verdade <a title=\"Artigo do BOL sobre DDL Triggers\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms175941(v=SQL.90).aspx\" target=\"_blank\">DDL Trigers<\/a> ) definidas no servidor.<\/p>\n<p>Qual a solu\u00e7\u00e3o ? Procurar pela danada e ver o porqu\u00ea ela estava impedindo do IIS usar o SQL Server&#8230; e\u00a0o problema come\u00e7ou aqui. Eu precisava de uma forma para encontrar as DDL triggers definidas no servidor.<\/p>\n<p>A primeira tentativa foi em:<\/p>\n<p><code>SELECT * FROM sys.triggers<\/code><\/p>\n<p>Rodei no banco <strong>master <\/strong>( que era o banco default do login ) e nada l\u00e1 &#8230;<br \/>\nPor que ? Uma r\u00e1pida olhada aqui no <a title=\"sys.triggers\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms188746(v=SQL.90).aspx\" target=\"_blank\">nesse artigo do BOL<\/a> que tem a documenta\u00e7\u00e3o dessa VIEW e vemos a descricao ali no come\u00e7inho:<\/p>\n<blockquote>[&#8230;]&#8221;DML trigger names are schema-scoped and, therefore, are visible in sys.objects.\u00a0DDL triggers names are scoped by the parent entity and are only visible in this view.&#8221;[&#8230;]<\/blockquote>\n<p>Isto \u00e9,em uma tradu\u00e7\u00e3o vagabunda feita por mim mesmo:<\/p>\n<blockquote><p>&#8220;Triggers DML s\u00e3o definidas no escopo do esquema e portanto podem estar disponiveis em sys.objects.\u00a0\u00a0Triggers DDL est\u00e3o no escopo da entidade pai e s\u00e3o vis\u00edveis somente nesta view.&#8221;<\/p><\/blockquote>\n<p>Ou seja, podemos encontrar aqui tanto <a title=\"DML Triggers\" href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms191524(v=SQL.90).aspx\" target=\"_blank\">triggers DML<\/a> quanto DDL. Mas as triggers DML tamb\u00e9m podem estar em <a title=\"sys.objects\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms190324(v=SQL.90).aspx\" target=\"_blank\">sys.objects<\/a>. Entidade pai \u00e9 o tipo do objeto para o qual a trigger foi criada. Olhando na tabelinha um pouco abaixo desse trecho baixo vemos os seguintes valores para as colunas que informam qual a entidade pai:\u00a0<strong>parent_class <\/strong>e <strong>parent_class_desc<\/strong>.<\/p>\n<ul>\n<li>Parent_class pode ser 0 <strong>OU<\/strong> 1.\u00a0Se for <em>0<\/em>, significa que a trigger tem a Entidade <strong>DATABASE<\/strong>, e veremos exatamente esse nome na coluna <em><strong>parent_class_desc<\/strong><\/em>. Isto \u00e9, a trigger foi definida para eventos do Banco em que foi criada. Se for <em>1<\/em>, significa que a trigger tem a Entidade <strong>OBJECT_OR_COLUMN<\/strong>, e veremos exatamente esse nome na coluna <em><strong>parent_class<\/strong><\/em>. Isto significa que a trigger foi criada para eventos em algum objeto .<\/li>\n<\/ul>\n<p>Bom o importante aqui \u00e9 que temos apenas dois valores poss\u00edveis pra <strong>parent_class <\/strong>e <strong>parent_class_desc<\/strong>&#8230; E nehum desses valores \u00e9 igual a <strong>SERVER, <\/strong>ou algo do tipo, isto \u00e9, n\u00e3o irei ver triggers definidas para o servidor nessa view, j\u00e1 que Triggers de Logon s\u00e3o definidas para ALL SERVER e n\u00e3o somente DATABASE.<\/p>\n<p>E l\u00e1 vai eu tentar advinhar onde achar qual o nome da bendita trigger de logon&#8230; Quando <em>googlando <\/em>muito, eu encontro a bendita <a title=\"Logon Triggers\" href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb326598(v=SQL.90).aspx\" target=\"_blank\">p\u00e1gina<\/a>.\u00a0Olhando l\u00e1 em baixo, no t\u00f3pico <strong>&#8220;Getting Information About Logon Triggers&#8221;<\/strong>, eu encontro isso:<\/p>\n<blockquote><p>&#8221; You can view metadata about logon triggers by querying the <a title=\"Documenta\u00e7\u00e3o de sys.server_triggers no BOL\" href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms176054(v=SQL.90).aspx\" target=\"_blank\">sys.server_triggers<\/a> catalog view. &#8220;<\/p><\/blockquote>\n<p>Vendo o nome <em><strong>sys.server_triggers<\/strong><\/em>, eu nao pensei em mais nada, nem cliquei no link, fui direito pro <a title=\"SQL Server Management Studio\" href=\"http:\/\/en.wikipedia.org\/wiki\/SQL_Server_Management_Studio\" target=\"_blank\">SSMS <\/a>e executei a query:<\/p>\n<p><code>SELECT * FROM sys.server_triggers<\/code><\/p>\n<p>E l\u00e1 estava ela, s\u00f3 tinha ela criada&#8230; quando vi o nome da trigger l\u00e1, lembrei que eu tinha criado a trigger pra alguns testes e que a mesma nao era importante. Dentro dela havia um insert em uma tabela, onde o login que estava se\u00a0conectando pelo IIS nao tinha permissao de insert, gerando um erro e falhando o login.\u00a0Dropei a danada, e como esperado, o IIS consegiu e o tudo funcionou sem problemas.<\/p>\n<p><span style=\"font-family:Georgia, 'Bitstream Charter', serif;line-height:24px;font-size:16px;\">Bom, o que eu posso concluir com isso \u00e9:<\/span><\/p>\n<ul>\n<li>Guarde as querys que te dao meta informa\u00e7\u00f5es do servidor.<\/li>\n<li>E guarde bem organizado para que voc\u00ea possa buscar isso facilmente depois.<\/li>\n<li><em><strong>E o mais importante: quando acabar a merda de algum teste lembra de desfazer as coisas que fez \ud83d\ude42 !<\/strong><\/em><\/li>\n<\/ul>\n<p>Antes de terminar, creio eu que alguns podem se estar perguntando: Por que esse idiota nao usou o SSMS, foi l\u00e1 em &#8220;Server Objects&#8221; e depois em &#8220;Triggers&#8221; ? ( L\u00e1 tem todas as triggers DDL definidas para o servidor )<\/p>\n<ul>\n<li>Primeiro: Eu tinha me esquecido na hora e lembrei quando come\u00e7ei a escrever esse post.<\/li>\n<li>Segundo: Mesmo se eu tivesse lembrando eu iria querer saber de todo jeito como eu faria pra consultar isso via T-SQL, pois se n\u00e3o tivesse o SSMS, e apenas um <a title=\"O que diabos \u00e9 SQLCMD ??? \" href=\"http:\/\/msdn.microsoft.com\/pt-br\/library\/ms162773.aspx\" target=\"_blank\">sqlcmd <\/a>da vida, eu iria conseguir achar ela. \ud83d\ude09<\/li>\n<\/ul>\n<p>Agora que eu tive que procurar, &#8220;sofrer&#8221; passando por alguns links e p\u00e1ginas, eu n\u00e3o esquecerei disso t\u00e3o cedo.<\/p>\n<p>Me desculpem erros de portugu\u00eas, palavr\u00f5es, etc &#8230;<em> t\u00e9 a pr\u00f3xima<\/em> !<\/p>\n<p style=\"text-align:right;\">[]s<br \/>\nRodrigo Ribeiro Gomes<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bom galera, resolvi passar por aki, aproveitando que estou na hora do rango! Aqui onde trabalho, estava acontecendo um erro em um dos servidores de teste quando alguem tentava logar no site que temos, tudo em ambiente de teste. A p\u00e1gina era(\u00e9) uma p\u00e1gina ASP. O erro era esse: Microsoft OLE DB Provider for ODBC&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2011\/01\/14\/quando-uma-sys-algo-pode-te-ajudar\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">Quando uma sys.algo pode te ajudar<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[7],"tags":[35,37,43,78,79,83],"series":[],"class_list":["post-8","post","type-post","status-publish","format-standard","hentry","category-sql-server","tag-ddl","tag-dml","tag-logon-triggers","tag-sys-server_triggers","tag-sys-triggers","tag-triggers"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/comments?post=8"}],"version-history":[{"count":0,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/8\/revisions"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=8"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}