ScornInPC 1 Report post Posted April 11, 2009 Pessoal, estou com 2 coisas na cabeça, que eu sei que da pra fazer com MSSQL, pois o SAP B1 faz. Estou desenvolvendo um sistema, e queria garantir a integridade dos dados, impossibilitando o usuário executar queries de estrutura ou dados direto no banco. Gostaria também de desenvolver bloqueios personalizados direto no banco. Por exemplo, o usuario cadastra um cliente com o código C0001, dai eu faço uma transaction para validar este código. 1° pergunta: É possivel identificar em algum lugar no MySQL as queries executadas e qual programa executou estas queries? Assim consigo fazer um log de quem executou queries que não sejam de consulta, e sei se o usuário perdeu a garantia ou não do sistema. 2° - É possivel, antes de dar um insert por exemplo, executar uma query, que retorne valide algu campo? Por exemplo, eu dou um insert. O MySQL vai em algum lugar e executa uma outra querie pré definida. Se retornar TRUE executa o insert, se retornar FALSE, não executa o insert e retorna uma mensagem definida na minha query trigger. É possivel fazer isso? se não entenderem direito, me digam ok? tento explicar melhor =) Valeu pessoal. Share this post Link to post Share on other sites
hinom 5 Report post Posted April 12, 2009 impossibilitando o usuário executar queries de estrutura ou dados direto no bancocrie uma conta limitada com permissões somente para insert, upade, delete e select O usuário possui acesso ao servidor mysql ? (ao sistema operacional) (se possuir acesso ao SO, ficaria complicado criar segurança) o que eu faria é manter o server lacrado, onde o usuário nçao teria acesso nem mesmo ao hardware. todo o sistema ficaria no servidor e o cliente acessaria somente via browser (aplicativo web, PHP, ASP, JSP, etc..) para aplicativos tipo VB, DElphi, C++, JAVA, codifique os dados de conexão e outros dados sensíveis Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 12, 2009 Opa Hinom. Bem, a possibilidade de lacrar o server é descartada =/ Realmente eu gostaria de fazer isso, por inumeros motivos, mas não é possivel =/ Eu cheguei a pensar em na instalação eu crio um usuário, e utilizo este usuário com meu software. Para ver a integridade, eu verifico todas as queries executadas, sem ser pelo meu aplicativo, e sei sei existe inserts. Porem meu aplicativo possui criação dinamica de relatorios, dai eu teria que ficar tratando as queries que os usuários digitassem tb. Vou verificar melhor como a SAP faz isso, pois não é possivel que eu não consiga colocar um identificador ou algo do tipo nas minhas queries para saber de onde ta sendo executado =) Bem, no aguardo de alguma idéia =) Share this post Link to post Share on other sites
giesta 29 Report post Posted April 12, 2009 show full processlist; te da o nome da maquina , o usuario , a quanto tempo a query tah rodando e o status dela e algumas outras coisas Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 12, 2009 Giesta, estes processos ficam armazenados em algum lugar e tem como recuperar isso? é justamente isso que eu quero, mas não só no momento, quero alguma coisa do tipo mas não só do momento Share this post Link to post Share on other sites
giesta 29 Report post Posted April 12, 2009 Nao ficam nao, mas você pode inventar algum bacalhau maluco para armazenar, mas sinceramente acho q você deveria abordar este seu problema com procedures. Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 12, 2009 Então, não quero fazer gambiarra, quero usar alguma coisa nativa do mysql pra isso. Bem, antes que alguem pergunte, quero fazer isso por que meu sistema tem 250 tabelas e possui coisas fiscais, então antes que alguem queria tentar apagar ou atualizar alguma coisa direto na base, perderá a garantia e eu não fique mais responsável pelo sistema. Essa é a politica adotada pela SAP, e eu achei bastante coerente. Bem, ja procurei se existe procedures pre-definidas para algumas coisas, mas não achei nada do tipo. Giesta, como resolveria isso com procedures? Share this post Link to post Share on other sites
giesta 29 Report post Posted April 12, 2009 Qual é o problema de trancar o banco deixando apenas um usuario usar o banco de dados, q eh o usuario do programa e entao jogar a senha fora? Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 12, 2009 Pois apesar de querer garantir a integridade dos dados, o usuário pode executar queries de consulta, ou um outro programa ter que ler meu banco para uma integração, etc ... etc ... Geralmente quem cria este usuário, que é o administrador do banco, não sou eu, é o departamento de TI do meu cliente. Então preciso saber disso. Estou com esse problema, pois sei que o usuário removeu o valor de um item de uma cotação, direto no banco, pois pelo sistema ele não conseguiu por tinha frete, um relacionamento. após ele fazer a remoção, começou a ocorrer alguns problemas referentes à esta cotação. o pedido saiu errado, a nota saiu errada e por ai vai. Se eu tivesse como saber se foi executado um delete sem ser pela minha aplicação, ja teria dado um check mate nisso. Bem, é isso =) Share this post Link to post Share on other sites
giesta 29 Report post Posted April 12, 2009 Faz dois usuarios entao um q faz as 4 operacoes e um q soh da select, dai o maximo q ele consegue eh travar o banco com produto cartesiano, mas nao corrompe os dados nem muda nada alem disso se você trabalha pra um cliente q tem departamento de TI pode ter certeza q eles irao ao inferno e voltarao duas se for preciso para garantir q sua aplicacao nao vai funcionar. Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 13, 2009 O departamento de TI que digo, é gente que formata computador e curioso. No maximoele vai entrar, deletar, e ver no que da. Não posso garantir 2 usuários diferentes, quem cuida da administração é a empresa, ele pode criar um usuario, da a permissão, delete, e apaga o usuario. Não acredito que o mysql não tenha logs de execução. Share this post Link to post Share on other sites
giesta 29 Report post Posted April 13, 2009 Tem log de execucao, mas nao dentro do banco.... e pra mim nao resolve, saber quem fez nao impede de fazer de qualquer forma basta startar o servidor com -l mysqld -l Share this post Link to post Share on other sites
hinom 5 Report post Posted April 13, 2009 isso que o giesta comentou é verdade.. é bom colocar isso num contrato, pois essa sua situação é muito vulnerável especifique num contrato que você não possui responsabilidades sobre falhas no sistema, uma vez que outros possuem acesso à estrutura do banco de dados Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 13, 2009 Isso eu ja possuo no contrato, porem para um diretor, eu preciso dizer pra ele com evidencias concretas, de que quem causou o problema foi um funcionário dele, e não um problema do sistema. Se para o diretor a nota ta saindo errado, para ele é o sistema que está com problemas =/ To enrrolado xD Como trabalho com SAP, amanha vou pegar algumas documentações para ver se acho alguma coisa sobre. Pessoal e sobre minha outra duvida? é possivel? 2° - É possivel, antes de dar um insert por exemplo, executar uma query, que retorne valide algu campo? Por exemplo, eu dou um insert. O MySQL vai em algum lugar e executa uma outra querie pré definida. Se retornar TRUE executa o insert, se retornar FALSE, não executa o insert e retorna uma mensagem definida na minha query trigger. Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 13, 2009 flood,desculpa. Atualizei a pagina Share this post Link to post Share on other sites
giesta 29 Report post Posted April 13, 2009 2° - É possivel, antes de dar um insert por exemplo, executar uma query, que retorne valide algu campo? Por exemplo, eu dou um insert. O MySQL vai em algum lugar e executa uma outra querie pré definida. Se retornar TRUE executa o insert, se retornar FALSE, não executa o insert e retorna uma mensagem definida na minha query trigger. Sim, via procedure Share this post Link to post Share on other sites
koga021 0 Report post Posted April 13, 2009 Pow pelo menos aqui no trabalho nos trabalhamos com Log, porem e uma tabela log que fica o id do cara que fez a operaçao, tipo da operaçao e valor da operaçao se tiver,data hora, e a quem afetou diretamente. Esse Squema gera um controle bastante amplo, porem a tabela de LOG cresce que e uma beleza. Acho que seria uam boa ideia ate porque os dados ficam mais arrumados caso aconteça alguma m***** com o sistema. Se for um servidor LInux, acredito que tenha algum log do Mysql sim. abraço Share this post Link to post Share on other sites
koga021 0 Report post Posted April 13, 2009 tava lendo o manual achei algo aqui interessante. abraço http://dev.mysql.com/doc/refman/4.1/pt/query-log.html Share this post Link to post Share on other sites
ScornInPC 1 Report post Posted April 13, 2009 hehehe ótimo isso Koga, foi realmente o que eu pensei, ja que o MSSQL tambem trabalha assim. Dai entraria minha 2° duvida, como disparar uma procedure em determinado momento =) por exemplo, disparar uma procedure ao inserir um registro na tabela "BPRT" por exemplo. Share this post Link to post Share on other sites
giesta 29 Report post Posted April 13, 2009 Como eu disse antes, usar -l ou --log (da no mesmo) nao adianta no seu caso pq o log eh gerado em arquivo e nao em tabela dentro do banco, entao nao da pra você fazer um proc em cima disso. Share this post Link to post Share on other sites