Erro ao alterar usuário com h2 [ RESOLVIDO ]

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.

Oq isso aqui retorna? usuario.getUsuarioAtual()

É int? String?

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]

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

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

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);

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 “?”.

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.

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

Resolvido.