Erro ao alterar usuário com h2 [ RESOLVIDO ]

8 respostas
D

Olá amigos, estou tendo um problema ao tentar alterar o nome de usuário com h2.

public boolean alterarUsuario(UsuarioBean usuario){
           String sql = "ALTER USER ? RENAME TO ?"; 
    
           try {
        PreparedStatement pstm = Conexao.getInstanceConnection(null, null).prepareStatement(sql);
                          pstm.setString(1,usuario.getUsuarioAtual());
                          pstm.setString(2,usuario.getUsuarioNovo());
                          pstm.execute();
                          pstm.close();
        
        } catch (SQLException ex) {
            
          return false;
        }
           return true;
    }

É lançado uma exceção informando erro de sintaxe, mas ao alterar diretamente pelo h2, alterando o “?” pelo usuário é claro, funciona normal.

8 Respostas

Hebert_Coelho

Oq isso aqui retorna? usuario.getUsuarioAtual()

É int? String?

D

Retorna uma String, mas fiz um debug e ao chegar na linha 5 é lançada a exceção informando erro de sintaxe.

Erro:

Syntax error in SQL statement “ALTER USER ? [*] RENAME TO ?”; expected “identifier”; code: [42001-164]

Hebert_Coelho

Não precisa de ’ (aspas)?
Não sei como funciona com o h2, mas para o postgres funciona com ’ simples

D

Não, não precisa, usando preparedStatement não é necessário.

E

Olhem a sutileza…
Olhando a documentação, a sintaxe é algo como:

ALTER USER sa SET PASSWORD ‘senha’

Quando você usa PreparedStatement, ele não consegue trocar os identificadores (ou seja, as coisas que não são cercadas por aspas) usando setString (o setString é algo que implicitamente põe as aspas. - do jeito que você fez, ele tenta fazer algo como ALTER USER ‘sa’ SET PASSWORD ‘senha’ mas ele não aceita as aspas em torno do nome do usuário .

Portanto, para montar o comando, provavelmente você terá de fazer algo como:

String sql = "ALTER USER " + usuario + " SET PASSWORD ?";
...
pstm.setString (1, senha);
E

Hum, eu vi o comando errado, é ALTER USER nomeantigo RENAME TO nomenovo

De qualquer maneira, o que eu falei continua válido. Só que nesse caso nenhum dos nomes (nome novo e nome antigo) pode ser cercado por aspas.

Então você é obrigado a montar a string SQL completa e não pode usar “?”.

D

Ok amigo, muito obrigado, amanhã quando chegar no trabalho testarei e postarei o resultado.
Só pra avisar, se alguém um dia precisar, ao alterar o nome de usuário do h2, automaticamente a senha se tornará inválida, obrigando assim seta-la em seguida.

D

Obrigado entanglement, o problema foi resolvido com sua dica, nem imaginei que isso seria um problema. Obrigado também ao jakefrog por ajudar.

Resolvido.

Criado 13 de setembro de 2012
Ultima resposta 14 de set. de 2012
Respostas 8
Participantes 3