Realizar insert junto de select - SQL

14 respostas
carol_programadora

Oi gente,

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 funciona
 sql = "Select * from usuarios OR select 1 = (Insert into usuarios(...) values(...))"

14 Respostas

Rodrigo_Sasaki

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

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

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

Criado 6 de setembro de 2013
Ultima resposta 6 de set. de 2013
Respostas 14
Participantes 4