4
respostas

Desfazer comando feito.

Olá, estou gostando muito da aula. Gostaria de uma informação que o professor não mencionou na aula, até porque pode possivelmente não existir. Existe algum comando que quando executado desfaz a ultima ação feita? Por exemplo, alterei todos os valores do meu banco de dados sem querer e quero desfazer isso (como um Ctrl+Z), é possível? Obrigado.

4 respostas

Se você trabalhar com transações, poderia desfazer os últimos comandos (ROLLBACK) ou aceitar as alterações (COMMIT).

Sem usar transações, você teria que fazer um backup do banco ou da tabela que vai ser alterada, para no caso de erro copiar de volta as informações.

Aqui tem algumas explicações sobre como criar transações no MySQL

http://sqlparatodos.com.br/transacoes-no-mysql/

http://dba.fyicenter.com/faq/mysql/Rollback-the-Current-Transaction.html

Olá. Pra isso você deve usar o conceito de transações. Uma transação é um bloco de código no qual você define um "tudo ou nada": ou ele executa todos os comandos do bloco e, em caso de sucesso, ele "comita" a transação (grava o resultado) ou, em caso de algum erro, ele executa o ROLLBACK que é voltar ao estado original do banco.

Exemplo:

BEGIN TRANSACTION Teste  ;  -- começo da transação
   UPDATE Notas
   SET Resultado = 'APROVADO'
   WHERE Notas.ID IN (1, 10, 23, 150);

   INSERT INTO Tabela1 VALUES(1);

   INSERT INTO Tabela2 VALUES(2);

   DELETE FROM ControleCaixa where ID < 100;

COMMIT;   -- fim da transação. Se chegou até aqui, tudo do bloco será gravado com sucesso.

O que tiver no bloco pode ser qualquer comando: insert, delete, update, ...

Tem o próprio comando ROLLBACK que desfaz a operação. Eu acredito que isto será visto mais adiante. Pelo menos em outro curso, por se tratar de algo mais avançado. Embora o conceito seja simples, existem muitas variações, inclusive de fazer TRY - CATCH, caso alguma condição aconteça, pode forçar um rollback de toda a transação.

Enfim, é material para pelo menos mais uma aula.

Vitor, só complementando, isso que você fez é algo muito comum, praticamente todo mundo já fez um UPDATE sem WHERE, uma dica, antes de fazer um UPDATE ou um DELETE, faça um SELECT para testar a sua condição WHERE, se o retorno dela for os dados que você pretende alterar, basta monta o seu UPDATE ou o seu DELETE e usa a condição já testada.

Muitos lugares trabalham com dados autocommit, e nesse caso não terá rollback, ou seja, terá que fazer um restore da base, o que pode demorar um pouco.

Muito obrigado pelas respostas, muito legal o que pode ser feito pra evitar resultados indesejados!