Preciso executar em uma aplicação Java uma SET schema ?
instrução, onde o placeholder é substituído por um valor fornecido em tempo de execução pelo chamador.
Eu assumi que poderia usar PreparedStatement
para superar a potencial injeção de SQL, mas se eu tentar executar uma instrução preparada, recebo uma PSQLException
mensagem com
ERROR: syntax error at or near "$1" Position: 18
Se eu executar o SQL apenas concatenando o nome do esquema fazendo:
public void executeSetSchema(Connection con, String schema){
try{
Statement stmt = con.createStatement();
stmt.execute("SET SCHEMA '" + schema + "'");
} catch(Exception){}
}
Então tudo funciona como esperado.
Claramente, isso acontece com todas as versões mais recentes do PostgreSQL
Por que não posso usar um PreparedStatement e o que devo fazer para evitar a injeção de SQL aqui?
Você não pode passar identificadores como parâmetros. É semelhante a
select * from ?
No entanto, você pode usar uma função para definir o caminho de pesquisa:
Mudei a
prepareStatement()
chamada para um try-with-resources para que a instrução seja fechada corretamente.Eu tenho código de trabalho com