queria saber se tem uma forma de executar um insert junto de uma instrução select sem inserir o término " ; " do select?
Isso funciona se eu executar direto no banco:
sql = "Select * from usuarios; Insert into usuarios(...) values(...)"
Mas eu preciso sem utilizar o " ; ", pois o código será executado numa aplicação PHP que não aceita ponto e vírgula:
Queria algo que fosse ± isso e funcionasse:
// Sei que isso não funcionasql="Select * from usuarios OR select 1 = (Insert into usuarios(...) values(...))"
Você quer executar 2 operações no BD, que não tem relação, mas ao mesmo tempo. É isso?
carol_programadora
Isso mesmo, banco oracle.
Rodrigo_Sasaki
E o seu sistema permite rodar um script assim? não seria melhor (e mais simples) fazer separado mesmo?
drsmachado
Você consegue fazer isso diretamente com SQL?
carol_programadora
É um sistema que a empresa está adquirindo e eu estou testando, achei uma falha de SQL injection, estou tentando utilizar essa falha pra cadastrar informações demonstrando que o sistema tem falhas críticas.
carol_programadora
Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.
G
GabrielMantini
Eu sei que você pode fazer uma subquerie, mais seria algo do tipo Insert into “table” values(“SEU SELECT AQUI”).
Mas não sei se é isso que precisa.
drsmachado
Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.
Isso acontece por que o SGBD, seja ele qual for, precisa identificar um ponto de parada de uma instrução. Basicamente, este ponto de parada é o ‘;’ e, por isso ele deve ficar ali.
Se você deseja realizar duas instruções, terá que fazer duas chamadas. É a forma mais sensata e simples.
Se o insert dependesse do select, você poderia fazer um SELECT INTO.
Uma outra opção é criar uma stored procedure, que faria as duas coisas (select e insert) separadas (e faria muitas outras mais), porém com apenas uma requisição do sistema.
G
GabrielMantini
Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.
Isso acontece por que o SGBD, seja ele qual for, precisa identificar um ponto de parada de uma instrução. Basicamente, este ponto de parada é o ‘;’ e, por isso ele deve ficar ali.
Se você deseja realizar duas instruções, terá que fazer duas chamadas. É a forma mais sensata e simples.
Se o insert dependesse do select, você poderia fazer um SELECT INTO.
Uma outra opção é criar uma stored procedure, que faria as duas coisas (select e insert) separadas (e faria muitas outras mais), porém com apenas uma requisição do sistema.
É, realmente não pensei nisso.
Com isso vocÇê resolve seu problema, seja com o select into ou a SP.
Perfeito drsmachado
Rodrigo_Sasaki
Acho que não, a realidade é que ela quer provar que existe um risco de SQL Injection, então ela realmente precisa fazer na mesma String.
drsmachado
Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...
Rodrigo_Sasaki
Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...
Isso mesmo que eu pensei.
Eu acho que ela quer a parafernalha mesmo hehehe, se o CASE funcionar, acho que o problema tá resolvido
drsmachado
Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...
Isso mesmo que eu pensei.
Eu acho que ela quer a parafernalha mesmo hehehe, se o CASE funcionar, acho que o problema tá resolvido
O problema é a condição para o case e, temos de lembrar que ele só funcionará com resultado igual para cada condição.
Rodrigo_Sasaki
É, ela teria que passar a query exata pra gente, pra podermos identificar o ponto de risco, e partir daí.
Eu duvido que seja o SELECT * ali de cima