{"id":389,"date":"2018-12-04T21:10:30","date_gmt":"2018-12-04T23:10:30","guid":{"rendered":"http:\/\/lucianodev.com.br\/blog\/?p=389"},"modified":"2022-06-09T01:37:51","modified_gmt":"2022-06-09T04:37:51","slug":"vai-dar-m-parte-2-banco-de-dados","status":"publish","type":"post","link":"https:\/\/lucianodev.com.br\/blog\/vai-dar-m-parte-2-banco-de-dados\/","title":{"rendered":"Vai dar M! Parte 2  &#8211; Banco de Dados. Cuidado para n\u00e3o ter preju\u00edzos."},"content":{"rendered":"<p><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-4648498281437791\"\n     crossorigin=\"anonymous\"><\/script><br \/>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-4648498281437791\"\n     data-ad-slot=\"6352579729\"><\/ins><br \/>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><\/p>\n<p>Uma das \u00e1reas da programa\u00e7\u00e3o que tem ganhado bastante destaque\u00a0 \u00e9 a programa\u00e7\u00e3o com Banco de Dados com a linguagem SQL, independente o sistema gerenciador de banco de dados (SGBD) usado: como MySQL, SQL Server e etc.<\/p>\n<p>As atuais ferramentas de programa\u00e7\u00e3o de banco de dados que d\u00e3o suporte \u00e0 linguagens baseadas em SQL oferecem uma s\u00e9rie de recursos que facilitam a execu\u00e7\u00e3o de comandos, por\u00e9m, \u00c9 MUITO IMPORTANTE SABER como esses recursos podem e devem ser utilizados, principalmente aqueles que envolvem a execu\u00e7\u00e3o personalizada de trechos &#8220;selecionados&#8221; de instru\u00e7\u00f5es em SQL.<\/p>\n<p>Todos n\u00f3s sabemos que \u00e9 natural durante a programa\u00e7\u00e3o errarmos trechos de comandos ou esquecer linhas de c\u00f3digo, contribuindo para um mau funcionamento de um sistema, mas na pior das hip\u00f3teses (embora <strong>n\u00e3o \u00e9 isso que desejo<\/strong>), e melhor um sistema pare de funcionar momentaneamente por falha de programa\u00e7\u00e3o do que esquecer uma condi\u00e7\u00e3o em uma instru\u00e7\u00e3o em SQL dentro de uma instru\u00e7\u00e3o UPDATE ou DELETE, que pode acarretar em <strong>UMA PERDA IRREVERS\u00cdVEL DE DADOS<\/strong> (na casa de milhares ou milh\u00f5es de registros), pois softwares podem ser substitu\u00eddos em casos de problemas, mas os dados deletados acidentalmente de banco de dados (caso n\u00e3o tenha o backup deles) \u00e9 algo muito grave.<\/p>\n<p><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-4648498281437791\"\n     crossorigin=\"anonymous\"><\/script><br \/>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-4648498281437791\"\n     data-ad-slot=\"6352579729\"><\/ins><br \/>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><\/p>\n<h2>1) Execu\u00e7\u00f5es SQL acidentais que n\u00e3o causam preju\u00edzos<\/h2>\n<p>\u00c9 natural quando escrevemos uma instru\u00e7\u00e3o em SQL realizarmos testes de sua execu\u00e7\u00e3o completa ou parte de seu c\u00f3digo (fazendo uma sele\u00e7\u00e3o espec\u00edfica). \u00c9 nessas horas que precisamos tomar cuidado com o que vai selecionar , ou melhor, deixar de selecionar, acarretando em uma execu\u00e7\u00e3o n\u00e3o desejada.<\/p>\n<p>Vamos supor a seguinte situa\u00e7\u00e3o: Voc\u00ea possui uma base de dados em MySQL que possui in\u00fameros registros de funcion\u00e1rios (em uma tabela chamada &#8220;funcionarios&#8221;) e voc\u00ea precisa realizar uma filtragem dos funcion\u00e1rios pelo seu cargo (supondo por exemplo o cargo de &#8220;ANALISTA DE SISTEMAS&#8221;), usando o bom e velho comando <strong>SELECT<\/strong>. Para essa demonstra\u00e7\u00e3o considere a instru\u00e7\u00e3o MySQL abaixo:<\/p>\n<pre class=\"lang:mysql decode:true \">select * from funcionarios\r\nwhere cargo = \"ANALISTA DE SISTEMAS\";<\/pre>\n<p>Suponha agora que voc\u00ea precise executar a consulta mostrada acima, realizando a sele\u00e7\u00e3o da mesma (e efetuando a execu\u00e7\u00e3o de comandos SQL baseado no que foi selecionado). \u00c9 muito comum que, acidentalmente, selecionemos o comando dessa forma:<\/p>\n<figure id=\"attachment_395\" aria-describedby=\"caption-attachment-395\" style=\"width: 458px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-395 size-full\" src=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_1.jpg\" alt=\"Vai dar M! #2 - Banco de Dados.\" width=\"458\" height=\"115\" srcset=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_1.jpg 458w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_1-300x75.jpg 300w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_1-110x28.jpg 110w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_1-420x105.jpg 420w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><figcaption id=\"caption-attachment-395\" class=\"wp-caption-text\">C\u00f3digo selecionado de forma incompleta<\/figcaption><\/figure>\n<p>Ao executarmos a consulta acima, retornaremos <strong>acidentalmente<\/strong> todos os funcion\u00e1rios cadastrados no banco de dados, por\u00e9m, isso n\u00e3o acarretar\u00e1 em nenhuma perda ou dano aos dados cadastrados (ainda bem!).<\/p>\n<p>&nbsp;<\/p>\n<h2>2) Execu\u00e7\u00f5es SQL acidentais prejudicais ao Banco (da pra consertar)<\/h2>\n<p>Agora diferente do que foi mostrado acima, vamos considerar agora uma nova situa\u00e7\u00e3o. Suponha que voc\u00ea precisa <strong>ATUALIZAR<\/strong> todos os sal\u00e1rios dos funcion\u00e1rios do cargo de &#8220;GERENTE&#8221; para <strong>R$ 6.500,00<\/strong>. Sabemos que o comando SQL que precisamos utilizar \u00e9 o <strong>UPDATE <\/strong>para essa situa\u00e7\u00e3o. Vamos considerar para o objetivo proposto a execu\u00e7\u00e3o do seguinte c\u00f3digo em MySQL abaixo:<strong><br \/>\n<\/strong><\/p>\n<pre class=\"lang:default decode:true\">update funcionarios set salario=6500.00\r\nwhere cargo = 'GERENTE';<\/pre>\n<p>Suponha agora que voc\u00ea precise executar a consulta mostrada acima, realizando a sele\u00e7\u00e3o da mesma de forma ERRADA como podemos ver na figura abaixo:<\/p>\n<figure id=\"attachment_398\" aria-describedby=\"caption-attachment-398\" style=\"width: 443px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-398 size-full\" src=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_2.jpg\" alt=\"Vai dar M! #2 - Banco de Dados.\" width=\"443\" height=\"108\" srcset=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_2.jpg 443w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_2-300x73.jpg 300w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_2-110x27.jpg 110w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_2-420x102.jpg 420w\" sizes=\"auto, (max-width: 443px) 100vw, 443px\" \/><figcaption id=\"caption-attachment-398\" class=\"wp-caption-text\">Selecionando o comando de forma errada, novamente.<\/figcaption><\/figure>\n<p>Se executarmos esse comando somente pela sele\u00e7\u00e3o, teremos um <strong>PREJU\u00cdZO GRANDE\u00a0<\/strong>, atualizando todos os sal\u00e1rios dos funcion\u00e1rios independente do cargo para R$ 6.500,00 (quem dera!).<\/p>\n<p>A atualiza\u00e7\u00e3o de todos os valores do campo sal\u00e1rio para todos os funcion\u00e1rios, apesar de ser um preju\u00edzo, ainda \u00e9 revers\u00edvel, podendo ser consertado executando v\u00e1rios comandos <strong>UPDATES <\/strong>atualizando os sal\u00e1rios dos respectivos cargos.<\/p>\n<p>&nbsp;<\/p>\n<h2>3) Execu\u00e7\u00f5es SQL acidentais irrevers\u00edveis (Agora j\u00e1 era!)<\/h2>\n<p>Continuando como uso do comando <strong>UPDATE<\/strong>, suponha a seguinte situa\u00e7\u00e3o onde precisamos mudar o nome de um funcion\u00e1rio espec\u00edfico (pelo seu c\u00f3digo), e a execu\u00e7\u00e3o acontecesse pela sele\u00e7\u00e3o dessa forma (de forma errada):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-399 size-full\" src=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_3.jpg\" alt=\"Vai dar M! #2 - Banco de Dados.\" width=\"441\" height=\"151\" srcset=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_3.jpg 441w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_3-300x103.jpg 300w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_3-110x38.jpg 110w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_3-420x144.jpg 420w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/p>\n<p>A execu\u00e7\u00e3o do c\u00f3digo acima acarretaria em todos os funcion\u00e1rios com o mesmo nome &#8220;Roberto Augusto&#8221; (imagine isso em uma tabela com milhares de funcion\u00e1rios? Seria um preju\u00edzo total).<\/p>\n<p>Agora imagine que precisamos ter que deletar um funcion\u00e1rio espec\u00edfico pelo seu &#8220;id&#8221; e realizamos isso desta forma:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-406 size-full\" src=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_4_2.jpg\" alt=\"Vai dar M! #2 - Banco de Dados.\" width=\"446\" height=\"113\" srcset=\"https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_4_2.jpg 446w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_4_2-300x76.jpg 300w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_4_2-110x28.jpg 110w, https:\/\/lucianodev.com.br\/blog\/wp-content\/uploads\/2018\/12\/imagem_post_vai_dar_m2_4_2-420x106.jpg 420w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/p>\n<p>Nem preciso dizer que a execu\u00e7\u00e3o do comando selecionado acima acarretar\u00e1 em <strong>PERDA TOTAL DOS DADOS<\/strong> da tabela de funcion\u00e1rios n\u00e3o \u00e9 ?<\/p>\n<p>&nbsp;<\/p>\n<h2>4) Conclus\u00e3o<\/h2>\n<p>Neste POST vimos que sempre temos que tomar muito cuidado como vamos selecionar os comandos SQL, para n\u00e3o acarretar em preju\u00edzos irrevers\u00edveis. H\u00e1 algumas ferramentas de SQL que j\u00e1\u00a0 s\u00e3o inteligentes o suficiente para detectar quando um <strong>UPDATE<\/strong> ou <strong>DELETE<\/strong> e executado sem a cl\u00e1usula <strong>WHERE<\/strong>, perguntando ou proibindo a sua execu\u00e7\u00e3o.<\/p>\n<p>Bom pessoal, por hoje \u00e9 s\u00f3. Espero que tenham gostado desse POST. Qualquer d\u00favida, fique a vontade para perguntar.<\/p>\n<p>Um forte abra\u00e7o para todos&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das \u00e1reas da programa\u00e7\u00e3o que tem ganhado bastante destaque\u00a0 \u00e9 a programa\u00e7\u00e3o com Banco de Dados com a linguagem SQL, independente o sistema gerenciador de banco de dados (SGBD)&hellip;<\/p>\n","protected":false},"author":1,"featured_media":403,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,4,3,13],"tags":[],"class_list":["post-389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-banco-de-dados","category-dicas","category-programacao","category-sql"],"_links":{"self":[{"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/posts\/389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/comments?post=389"}],"version-history":[{"count":17,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/posts\/389\/revisions"}],"predecessor-version":[{"id":730,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/posts\/389\/revisions\/730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/media\/403"}],"wp:attachment":[{"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/media?parent=389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/categories?post=389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lucianodev.com.br\/blog\/wp-json\/wp\/v2\/tags?post=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}