Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   repetir consulta para mas de una tabla (https://www.clubdelphi.com/foros/showthread.php?t=81538)

jsc 22-11-2012 21:17:52

repetir consulta para mas de una tabla
 
Hola
Necesitaria por optimizar codigo de la aplicacion hacer una consulta que fuera valida para mas de una tabla y pasando el nombre de la tabla y los campos como parametros.
Me explico:
Tengo tabla1datviejos y tabla1datnuevos por un lado(las dos tablas con la misma estructura)
Por otro tabla2datviejos y tabla2datnuevos (las dos tablas.con la misma estructura)
Necesitaria hacer lo siguiente:
1.-mirar en tabla1datviejos si hay datos almacenados en blanco(null)para un campo en concreto
2.-actualizar el campo con un valor en caso de que haya blancos(null)
3.- recorrer la tabla de inicio a fin y comparar los datos con tabla1datnuevos y añadir,modificar... los cambios que haya
Y todo esto mismo con tabla2datviejos
Habria manera de hacerlo todo en una o varias funciones pero siendo el codigo valido independiente de la tablancon labque se trabaje?vamos dicho de otro modo pasando por parametr,variable... el nombre de la tabla?
Antes de preguntar busque y encontre este hilo;
http://www.clubdelphi.com/foros/showthread.php?t=75875
No es muy seguro hacerlo alguien sabe de alguna manera que sea segura y que funcionaria?
Ahorraria mucho codigo a la hora de programar

Gracias y saludos

Casimiro Notevi 22-11-2012 21:23:33

¿Para qué base datos?
¿Desde SQL (base de datos) o desde Delphi?

jsc 23-11-2012 07:50:02

Cita:

Empezado por Casimiro Notevi (Mensaje 450223)
¿Para qué base datos?
¿Desde SQL (base de datos) o desde Delphi?

Hola
Seria desde delphi7 y estoy utilizando componentes ADOQuery
Probe con:
Código:

adoquery1.sql.add (select * from :tab where :campo Is Null)
Adoquery1.parameters.parambyname('tab').value:=combobox1.text;

pero no funciona y como digo en el hilo que puse se trataba el tema y parece que no era muy seguro por problemas con inyeccion de sql... si mal no recuerdo
Antes de ejecutar la consulta,utilizo dos combobox y en ellos cargo los nombres de las tablas de la bd.
Asi, mas tarde la intencion es en cada uno de ellos seleccionar la tabla origen, la tabla destino y poder comparar los datos entre otras cosas.
En un momento dado la origen y destino puede ser una y en otro momento purde ser otra. De ahi el interes de poder hacer la consulta lo mas flexible posible.
Si no, se me ocurre hacer para cada tarea un menu con las diferentes opciones, pero a nivel de prigramacuon no creo que sea lo ideal
Agradezco de antemano cualquier sugerencia

jsc 23-11-2012 10:20:50

ante todo disculpad mi ignorancia en este tema;

en el post que puse mas arriba habia un enlace a un hilo que trataba de inyeccion sql.
he recuperado un post de ese hilo con este enlace http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL que me parece muy interesante pero que lamentablemente poco entiendo
el problema que expuse en este hilo lo he solucionado de esta manera:
Código:

Código Delphi [-]


procedure openADOQuery (ADOQuery:TObject);
begin
  with frmadmin do
      WITH ADOQuery as TADOQuery do
      begin
        IF NOT prepared
            then
              begin
                  close ;prepared;
                  open
              end
            else open ;
      end;
end;

procedure muestratodosdatos () ;
var torigen,tdestino:string;
begin
  with frmadmin do
  begin
TRY
      torigen:= cbtold.text ;
      WITH ADOQuery1 do
      begin
        close ;sql.clear ;parameters.clear ;
        sql.add('SELECT * FROM '+torigen);
        openADOQuery (ADOQuery1);
        lold.Caption := inttostr(recordcount) ;
      end;
  EXCEPT on exception do MessageDlg ('Errores al cargar los datos',mtWarning,[mbOk],0) ;
  END;
...

esto me ha funcionado pero me preocupa el tema de la inyeccion sql; de esta manera quedaria el codigo expuesto a que software malicioso atacara la aplicacion y que por consiguiente esta fuera vulnerable?

vamos; otro ejemplo, con este codigo:
Código:

...
ADOQuery1.sql.add ('SELECT campo1,campo2 FROM tabla WHERE condicion =:parametro');
ADOQuery1.parameters.parambyname('parametro').value := unvalor ;
...

la aplicacion seria vulnerable a ataques?

repito, disculpad mi ignorancia
gracias y saludos,

Casimiro Notevi 23-11-2012 11:46:08

Pero no mezcles las cosas, ahora no se sabe qué has preguntado ni de lo que trata el hilo :confused:

jsc 23-11-2012 13:11:57

Cita:

Empezado por Casimiro Notevi (Mensaje 450266)
Pero no mezcles las cosas, ahora no se sabe qué has preguntado ni de lo que trata el hilo :confused:

lo siento,
la cuestion que pregunto es si con el codigo que he puesto arriba, la aplicacion es segura y no vulnerable a ataques de inyeccion sql.
como podreis imaginar los datos almacenados en la bd tienen que ser CONFIDENCIALES y no pueden estar expuestos a que cualquiera pueda alterarlos, leerlos...

no repito el codigo otra vez esta arriba, pero esto es una pincelada
Código:

  sql.add('SELECT * FROM '+torigen);
Código:

...
ADOQuery1.sql.add ('SELECT campo1,campo2 FROM tabla WHERE condicion =:parametro');
ADOQuery1.parameters.parambyname('parametro').value := unvalor ;
...


Casimiro Notevi 23-11-2012 14:05:17

Con parámetros, es lo más seguro.

jsc 23-11-2012 15:09:38

Cita:

Empezado por Casimiro Notevi (Mensaje 450284)
Con parámetros, es lo más seguro.

muchas gracias Casimiro Notevi
deduzco entonces que esto es seguro
Código:

...
ADOQuery1.sql.add ('SELECT campo1,campo2 FROM tabla WHERE condicion =:parametro');
ADOQuery1.parameters.parambyname('parametro').value := unvalor ;
...

pero en cambio la parte de codigo que contiene esto otro no lo es:
Código:

sql.add('SELECT * FROM '+torigen);
probe esto pero me da error de syntaxis en la clausula FROM
Código:

sql.add('SELECT * FROM :torigen');
parameters.parambyname('torigen').value := combobox1.text ;

combobox1.text coge el nombre de la tabla

si estoy en lo cierto, alguna idea de como podria implementarlo para que funcionara y fuera seguro?
gracias nuevamente

Casimiro Notevi 23-11-2012 17:05:55

En cuanto a lo de la seguridad, según tengo entendido por lo que he leído, sí, es así.

En cuanto al error, pues no sé, si no pones más código ;)

jsc 26-11-2012 13:52:26

Cita:

Empezado por Casimiro Notevi (Mensaje 450311)
En cuanto a lo de la seguridad, según tengo entendido por lo que he leído, sí, es así.

En cuanto al error, pues no sé, si no pones más código ;)

Hola nuevamente
Pues el codigo la verdad es que no tiene misterio
Código Delphi [-]
With adoquery do
Begin
  Close;sql.clear;
  parameters.clear;
  Sql.add('select * from :tabla');
  Parameters.parambyname('tabla').value:=combobox1.text;
  Open ;
End
Error:
Código:

error de syntaxis en la clausula From
La bd esta en access puede ser ese el problema?
Igual me repito mucho pero habria otra manera de hacerlo garantizando la seguridad?
Necesito que la consulta sea flexible a que el usuario pueda seleccionar las tablas y campos de la bd sobre las que hacer la consulta.
Los software comerciales lo hacen; posible sera pero en el como podriais darme idea?a mi lo que se me ocurrio ya lo he probado pero me da los problemas que ya he descrito en post de mas arriba.
Gracias y saludos

Casimiro Notevi 26-11-2012 14:03:46

No sé access, pero normalmente el nombre de una tabla no puede ser un parámetro.

Lo de la seguridad, tendrás que explicarte mejor, ¿de qué seguridad estamos hablando?, ¿a qué te refieres con "los software comerciales lo hacen"?
¿A qué te refieres con "necesito que la consulta sea flexible"?
Por cierto, eso de "select * ..." es la primera regla de la ineficiencia, nunca hacer eso.

jsc 26-11-2012 17:39:08

Gracias Casimiro Notevi por el seguimiento de este post

No se de que otra manera debo de explicarme;llevo todo el rato hablando de lo mismo
Cuando hago referencia a la seguridad:
Seguridad=garantizar la confidencialidad de los datos;que no haya problemas de inyeccion sql

Cuando hago referencia a flexibilidad:
Flexibilidad=exactamente lo que pongo arriba no se explicarlo de otro modo;si tengo un combobox donde se cargan los nombres de las tablas de la bd, el usuario tiene que poder elegir el nombre de la tabla en ese combobox y el valor de combobox1.tex sera el nombre de la tabla que ira despues de la clausula FROM en la consulta sql

Que lo hagan los software comerciales es exactamente eso;he visto software que permiten elegir nombres de tablas,campos de la tabla... y sacar informes personalizados; supongo que el nombre de la tabla y los campos seran parametros?

Asi esta mas claro?
Saludos y gracias

Casimiro Notevi 26-11-2012 17:45:08

En cuanto a la seguridad te recomiendo que hagas una búsqueda sobre por los foros, se ha tratado en alguna ocasión, aunque si quieres algo más amplio entonces es mejor que consultes webs especializada en el tema.
Lo de componer las consultas no se suele hacer así, eso que dices que "hacen los programas profesionales" es realmente componer la sentencia, me explico con un ejemplo a lo bruto:

Código Delphi [-]
sentencia := 'select';
campo1 := edit1.text;
campo2 := edit2.text;
tabla := combobox1.Text;
sentencia := sentencia + campo1 + campo2 + 'from'+ tabla
query1.close;
query1.sql.text := sentencia;
query1.open;

jsc 26-11-2012 18:05:43

Muchisimas gracias
Buscare por ahi a ver si encuentro algo
Muy agradecido por todo
Saludos


La franja horaria es GMT +2. Ahora son las 14:56:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi