Procedimientos Almacenados - Parametros

30/12/2004 - 23:55 por Romero Diego | Informe spam
Hola
Todos

Tengo un problema :
La tabla que describo a continuación tiene muchos campos y tengo que hacer
un reporte donde en una lista esten los nombres de los campos y el usuario
seleccione los que desee filtrar, esto se hace desde VB

El problema es como hago un procedimiento almacenado para paserle los
parametros segun los campos que seleccione o necesariamente debo crear
parametro por campo ?

SELECT IdVehiculo, Numero, IdClase, IdMarca, IdLinea, IdColor, IdTipoVeh,
IdTipoMot, AnnoModelo, FecRepotencia, Ejes, NumLlantas, PesoVeh, Pasajeros,
PasajPie, CapTanque, NumeroMotor, SerieChasis,
Cilindrada, IdTipoCom, IdTipoLla, IdTipoLub, IdMarLla, IdMarLub, IdEmpresa,
IdPropietario,
IdConductor, IdTipoPro, Adquisicion,IdGrupo,VehPropio,
IdProveedor, FecCompra, TarjetaProp, CostoCompra, ValorAvaludo,
ValorAsegurado,ValorCupo, IdAdmon,
NumContrato,ContratoActivo,FecIngreso,
FecRetiro,FecVigencia,FecSalida, VidaUtil, FecImpuestos, DocCompleta,
Accidentes,ObligaTProd, PolizaSoat,FecSoat,VigSoat,EmpresaSoat
,GarantiaAcc,PolizaResCivil,FecResCivil,VigResCivil,
CertMovilizacion, FecCertMovil, VigCertMovil, TarjetaOperacion, FecTarjOper,
VigTarjOper, CertGases, FecCertGases, VigCertGases,
Kilometraje, KmsCompra,
Observacion,CentInicial,CentFinal,CupoCredito,SaldoActual, ArchivoFoto,
IdEstado, FechaAdd, FechaUpdate, IdUsuario
FROM Vehiculos
WHERE ' aqui la condición que depende de los campos que seleccione el
usuario

gracias



Diego

Preguntas similare

Leer las respuestas

#41 Maxi
05/01/2005 - 15:15 | Informe spam
Hola, muy pero muy malo porque usas SqlDinamico!! eso no es lo peor, sino
que:

1) Es mas facil hacer injection de codigo malo
2) Si esto lo pones dentro de un Sp's vas a tener que no solo darle permisos
al Sp's sino tambien a todos los objetos que use el sql-dinamico.

Como veras el uso de esta tecnica no es aconsejable ya que le hace perder
los beneficios que tienen los Sp's.

Ojo, no es que nunca hay q usar Sql-Dinamico, yo lo uso pero para cosas muy
pero muy especificas y generalmente como herramientas para DBA o cosas por
el estilo :-)




Salu2
Maxi


"Romero Diego" escribió en el mensaje
news:Ox141$
Que rendimiento tiene el siguiente procedimiento, que me aconsejan :

CREATE PROCEDURE Pa_Query
(@pmCampos VARCHAR(1000),
@pmTabla VARCHAR(500),
@pmCriterio VARCHAR(500),
@pmOrden VARCHAR(100),
@pmGroup VARCHAR(100),
@pmHaving VARCHAR(100))

AS

BEGIN
Declare @pmQry VARCHAR(2500)
SET @pmQry=''
SET @pmQry=@pmQry + 'SELECT '+ @pmCampos + ' FROM ' + @pmTabla
IF Len(@pmCriterio)>0
BEGIN
SET @pmQry=@pmQry + ' WHERE '+ @pmCriterio
END
IF Len(@pmGroup)>0
BEGIN
SET @pmQry=@pmQry + ' GROUP BY ' + @pmGroup
END
IF Len(@pmOrden)>0
BEGIN
SET @pmQry=@pmQry + ' ORDER BY '+ @pmOrden
END
IF Len(@pmHaving)>0
BEGIN
SET @pmQry=@pmQry + ' HAVING '+ @pmHaving
END
EXECUTE (@pmQry)

RETURN
END
GO


Diego

"MAXI" escribió en el mensaje
news:#
Hola, creo que no me has entendido y por eso te confundis.

Si vos ya de movida pensas que un usuario puede escribir querys ya le


estas
dando muchos permisos a esta persona sea como sea.

La ventaja de armar el sp's es que luego eso es reutilizable.

Ahora, si un usuario puede armar querys de toda una bdd es casi un
administrador de la misma con lo cual no hay problema.

La injeccion de codigo se puede dar desde la aplicacion o no, pero aca


estas
confundiendo los temas y te explico porque:

Vos estas pensando que enviar Select armados desde la aplicacion es algo
bueno, esto ya sabemos que es inseguro verdad? entonces no lo hagamos
inseguro para todo el mundo, dejemos que un grupo reducido de personas
puedan hacer este tipo de tareas y que esten controladas. Esto va mas
alla
de lo que es un sistema, va desde el punto donde los datos son criticos y
como profesional en sistemas que sos deberias asegurar por sobre todas
las
cosas la seguridad de los datos, porque no creo que al director de una
empresa le guste mucho que un usuario por hacer querys pueda sacar el
listado de precios, los salarios del personal, etc, etc!! Si este
concepto
no lo consideras entonces no tiene mas sentido hablar de todo lo que
hablamos antes, y como te repeti en post anteriores (y no es en merito de
ofender) me da la sensacion por lo que escribes que siempre has


desarrollado
aplicaciones de un nivel X, donde quizas las exigencias o los controles
de
calidad no son los que muchas empresas medianas/grandes poseen, con lo


cual
poderte hacer entender todas estas cosas es un poco dificil


lamentablemente,
pero el dia que te toque desarrollar aplicaciones donde el control de
calidad sea algo serio o donde las exigencias sean otras, te vas a
acordar
de muchas de las cosas que decimos en este foro, generalmente los que
estamos aca estamos acostumbrados a trabajar en aplicaciones de nivel
critico con lo cual nuestros consejos son apuntados a esto, se supone que
una empresa si instala un motor de bdd como sqlserver es porque necesita
trabajar de forma corporativa (a menos que uses MSDE) con lo cual los
ambientes corporativos se manejan de una forma muy distinta a la que


muchos
desarrolladores independientes estan acostumbrados, es mas, a mi como
gerente de IT me cuesta mucho conseguir desarrolladores independientes
con
cierto nivel de calidad y concepto, con lo cual tuvimos que tomar la
desicion de que los desarrollos los haga una empresa que posea ciertas
cosas.

Bue ya me pase del mensaje, solo queria cerrar el tema, porque parece
como
que me estas peliando ;) y estas un poco confundida, aca yo intento
ascesorar y exponer mi experiencia lo maximo que pueda, luego queda en
ustedes si la toman o la dejan, nadie esta obligado a tomar todo lo que
se
dice en este foro no?

Un abrazo



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Danilsa" escribió en el mensaje
news:
>> donde hasta pueda unir mas de una tabla, te recomiendo que armes desde


la
>> aplicacion un modulo que de forma visual el usuario pueda armar estas
> cosas
>> y que el modulo lo transforme en un Sp's con sus respectivos


parametros.
>> Luego esa query la podra reutilizar este mismo usuario o cualquier
>> otro
> que
>> le den acceso.
>
> Crear el SP desde la aplicacion enviandolo como una cadena de texto al
> servidor (con su CREATE PROCEDURE y todo) ?
>
> Si es eso lo que entendí, no hay tambien aqui el riesgo de que le
> inyecten
> codigo en la aplicacion cliente como defendian en otros posts ? decian


que
> el codigo dinamico tanto lo pueden inyectar en el servidor como en la
> aplicacion no ?
>
> A veces los mensajes aqui se ven contradictorios. Y una lo que termina


es
> mas confundida de lo que empezó.
>
>
> Danilsa Jimenez
>
>
>






Respuesta Responder a este mensaje
#42 Carlos Sacristán
05/01/2005 - 15:25 | Informe spam
No seguí el hilo completamente, Maxi, de ahí que no te pueda decir nada
al respecto de lo que comentas. Lo único que me llamó la atención la
recomendación de usar un sp genérico con esa función para las consultas.

Todo aclarado, que los reyes les traigan muchas cositas!!!!!!


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Maxi" escribió en el mensaje
news:
Carlos, es cierto eso ;) pero pensa una cosa:

Si haces armar sql desde la aplicacion de forma dinamica tambien vas a


tener
el mismo problema, por eso lo que dije y vuelvo a decir es que deberias
tener 2 sp's genericos para los sqlgenericos y ademas los sp's


especificos!!
en este caso de consultas dinamicas donde lo que se busca que el usuario
pueda armar una query tampoco usara indices a menos que arme justo una
consulta que tengas indices, caso muy dificil de que suceda con la
variabilidad del caso ;)


Salu2
Maxi


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:u%
>> Si usas esto:
>>
>> select campos from tabla where campo1=isnull(@var1,campo1) and
>> campo2=isnull(@var2,campo2) and ..
>>
>> esto hara que no importa la cantidad de param que tengas que hara la
>> busqueda
>>
>> Entonces podrias tener un Sp's para los AND y otro SP's para los OR.
>
> Maxi, tienes razón en lo de que ese procedimiento almacenado sería
> genérico para todo tipo de consultas, pero también es cierto que usar
> ISNULL() invalida el uso de un índice útil que tuviera el campo al que


le
> aplicas la función... :-(
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
>


Respuesta Responder a este mensaje
#43 Maxi
05/01/2005 - 15:33 | Informe spam
Un abrazo mi amigo!! los reyes no me regalaron las vacaciones de la proxima
semana :-)


Salu2
Maxi


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
No seguí el hilo completamente, Maxi, de ahí que no te pueda decir nada
al respecto de lo que comentas. Lo único que me llamó la atención la
recomendación de usar un sp genérico con esa función para las consultas.

Todo aclarado, que los reyes les traigan muchas cositas!!!!!!


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Maxi" escribió en el mensaje
news:
Carlos, es cierto eso ;) pero pensa una cosa:

Si haces armar sql desde la aplicacion de forma dinamica tambien vas a


tener
el mismo problema, por eso lo que dije y vuelvo a decir es que deberias
tener 2 sp's genericos para los sqlgenericos y ademas los sp's


especificos!!
en este caso de consultas dinamicas donde lo que se busca que el usuario
pueda armar una query tampoco usara indices a menos que arme justo una
consulta que tengas indices, caso muy dificil de que suceda con la
variabilidad del caso ;)


Salu2
Maxi


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:u%
>> Si usas esto:
>>
>> select campos from tabla where campo1=isnull(@var1,campo1) and
>> campo2=isnull(@var2,campo2) and ..
>>
>> esto hara que no importa la cantidad de param que tengas que hara la
>> busqueda
>>
>> Entonces podrias tener un Sp's para los AND y otro SP's para los OR.
>
> Maxi, tienes razón en lo de que ese procedimiento almacenado sería
> genérico para todo tipo de consultas, pero también es cierto que usar
> ISNULL() invalida el uso de un índice útil que tuviera el campo al que


le
> aplicas la función... :-(
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
>






Respuesta Responder a este mensaje
#44 Romero Diego
05/01/2005 - 16:11 | Informe spam
Gracias Maxi por sus comentarios

Hasta la proxima
Fin de la discusión


Diego

"Maxi" escribió en el mensaje
news:
Hola, muy pero muy malo porque usas SqlDinamico!! eso no es lo peor, sino
que:

1) Es mas facil hacer injection de codigo malo
2) Si esto lo pones dentro de un Sp's vas a tener que no solo darle


permisos
al Sp's sino tambien a todos los objetos que use el sql-dinamico.

Como veras el uso de esta tecnica no es aconsejable ya que le hace perder
los beneficios que tienen los Sp's.

Ojo, no es que nunca hay q usar Sql-Dinamico, yo lo uso pero para cosas


muy
pero muy especificas y generalmente como herramientas para DBA o cosas por
el estilo :-)




Salu2
Maxi


"Romero Diego" escribió en el mensaje
news:Ox141$
> Que rendimiento tiene el siguiente procedimiento, que me aconsejan :
>
> CREATE PROCEDURE Pa_Query
> (@pmCampos VARCHAR(1000),
> @pmTabla VARCHAR(500),
> @pmCriterio VARCHAR(500),
> @pmOrden VARCHAR(100),
> @pmGroup VARCHAR(100),
> @pmHaving VARCHAR(100))
>
> AS
>
> BEGIN
> Declare @pmQry VARCHAR(2500)
> SET @pmQry=''
> SET @pmQry=@pmQry + 'SELECT '+ @pmCampos + ' FROM ' + @pmTabla
> IF Len(@pmCriterio)>0
> BEGIN
> SET @pmQry=@pmQry + ' WHERE '+ @pmCriterio
> END
> IF Len(@pmGroup)>0
> BEGIN
> SET @pmQry=@pmQry + ' GROUP BY ' + @pmGroup
> END
> IF Len(@pmOrden)>0
> BEGIN
> SET @pmQry=@pmQry + ' ORDER BY '+ @pmOrden
> END
> IF Len(@pmHaving)>0
> BEGIN
> SET @pmQry=@pmQry + ' HAVING '+ @pmHaving
> END
> EXECUTE (@pmQry)
>
> RETURN
> END
> GO
>
>
> Diego
>
> "MAXI" escribió en el mensaje
> news:#
>> Hola, creo que no me has entendido y por eso te confundis.
>>
>> Si vos ya de movida pensas que un usuario puede escribir querys ya le
> estas
>> dando muchos permisos a esta persona sea como sea.
>>
>> La ventaja de armar el sp's es que luego eso es reutilizable.
>>
>> Ahora, si un usuario puede armar querys de toda una bdd es casi un
>> administrador de la misma con lo cual no hay problema.
>>
>> La injeccion de codigo se puede dar desde la aplicacion o no, pero aca
> estas
>> confundiendo los temas y te explico porque:
>>
>> Vos estas pensando que enviar Select armados desde la aplicacion es


algo
>> bueno, esto ya sabemos que es inseguro verdad? entonces no lo hagamos
>> inseguro para todo el mundo, dejemos que un grupo reducido de personas
>> puedan hacer este tipo de tareas y que esten controladas. Esto va mas
>> alla
>> de lo que es un sistema, va desde el punto donde los datos son criticos


y
>> como profesional en sistemas que sos deberias asegurar por sobre todas
>> las
>> cosas la seguridad de los datos, porque no creo que al director de una
>> empresa le guste mucho que un usuario por hacer querys pueda sacar el
>> listado de precios, los salarios del personal, etc, etc!! Si este
>> concepto
>> no lo consideras entonces no tiene mas sentido hablar de todo lo que
>> hablamos antes, y como te repeti en post anteriores (y no es en merito


de
>> ofender) me da la sensacion por lo que escribes que siempre has
> desarrollado
>> aplicaciones de un nivel X, donde quizas las exigencias o los controles
>> de
>> calidad no son los que muchas empresas medianas/grandes poseen, con lo
> cual
>> poderte hacer entender todas estas cosas es un poco dificil
> lamentablemente,
>> pero el dia que te toque desarrollar aplicaciones donde el control de
>> calidad sea algo serio o donde las exigencias sean otras, te vas a
>> acordar
>> de muchas de las cosas que decimos en este foro, generalmente los que
>> estamos aca estamos acostumbrados a trabajar en aplicaciones de nivel
>> critico con lo cual nuestros consejos son apuntados a esto, se supone


que
>> una empresa si instala un motor de bdd como sqlserver es porque


necesita
>> trabajar de forma corporativa (a menos que uses MSDE) con lo cual los
>> ambientes corporativos se manejan de una forma muy distinta a la que
> muchos
>> desarrolladores independientes estan acostumbrados, es mas, a mi como
>> gerente de IT me cuesta mucho conseguir desarrolladores independientes
>> con
>> cierto nivel de calidad y concepto, con lo cual tuvimos que tomar la
>> desicion de que los desarrollos los haga una empresa que posea ciertas
>> cosas.
>>
>> Bue ya me pase del mensaje, solo queria cerrar el tema, porque parece
>> como
>> que me estas peliando ;) y estas un poco confundida, aca yo intento
>> ascesorar y exponer mi experiencia lo maximo que pueda, luego queda en
>> ustedes si la toman o la dejan, nadie esta obligado a tomar todo lo que
>> se
>> dice en este foro no?
>>
>> Un abrazo
>>
>>
>>
>> Maxi
>>
>> Buenos Aires - Argentina
>> Desarrollador .NET 3 Estrellas
>> Microsoft User Group (MUG)
>>
>> "Danilsa" escribió en el mensaje
>> news:
>> >> donde hasta pueda unir mas de una tabla, te recomiendo que armes


desde
> la
>> >> aplicacion un modulo que de forma visual el usuario pueda armar


estas
>> > cosas
>> >> y que el modulo lo transforme en un Sp's con sus respectivos
> parametros.
>> >> Luego esa query la podra reutilizar este mismo usuario o cualquier
>> >> otro
>> > que
>> >> le den acceso.
>> >
>> > Crear el SP desde la aplicacion enviandolo como una cadena de texto


al
>> > servidor (con su CREATE PROCEDURE y todo) ?
>> >
>> > Si es eso lo que entendí, no hay tambien aqui el riesgo de que le
>> > inyecten
>> > codigo en la aplicacion cliente como defendian en otros posts ?


decian
> que
>> > el codigo dinamico tanto lo pueden inyectar en el servidor como en la
>> > aplicacion no ?
>> >
>> > A veces los mensajes aqui se ven contradictorios. Y una lo que


termina
> es
>> > mas confundida de lo que empezó.
>> >
>> >
>> > Danilsa Jimenez
>> >
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#45 Danilsa
06/01/2005 - 00:27 | Informe spam
Hola, creo que no me has entendido y por eso te confundis.

Si vos ya de movida pensas que un usuario puede escribir querys ya le


estas
dando muchos permisos a esta persona sea como sea.




yo no estoy hablando de eso en este mensaje.


La ventaja de armar el sp's es que luego eso es reutilizable.




y no lo esta armando dinamicamente tambien ? no aplica lo mismo de la
inyeccion aqui ?


Ahora, si un usuario puede armar querys de toda una bdd es casi un
administrador de la misma con lo cual no hay problema.


La injeccion de codigo se puede dar desde la aplicacion o no, pero aca


estas
confundiendo los temas y te explico porque:




Yo solo estoy diciendo en ESTE MENSAJE (los demas son otra cosa) que me
parece una contradiccion que usted hable de que se puedan generar SP armados
dinamicamente desde la aplicacion cuando ha sugerido otras veces que no se
deban armar selects dinamicamente. Yo pienso que si en estos puede darse
la inyeccion de codigo desde la aplicacion, tambien en aquellos (los sp
generados de esa forma) pasa lo mismo , y quizas peor por ser un SP
reutilizable.

Vos estas pensando que enviar Select armados desde la aplicacion es algo
bueno, esto ya sabemos que es inseguro verdad? entonces no lo hagamos
inseguro para todo el mundo, dejemos que un grupo reducido de personas
puedan hacer este tipo de tareas y que esten controladas. Esto va mas alla
de lo que es un sistema, va desde el punto donde los datos son criticos y
como profesional en sistemas que sos deberias asegurar por sobre todas las
cosas la seguridad de los datos, porque no creo que al director de una
empresa le guste mucho que un usuario por hacer querys pueda sacar el
listado de precios, los salarios del personal, etc, etc!! Si este concepto
no lo consideras entonces no tiene mas sentido hablar de todo lo que
hablamos antes, y como te repeti en post anteriores (y no es en merito de
ofender) me da la sensacion por lo que escribes que siempre has


desarrollado
aplicaciones de un nivel X, donde quizas las exigencias o los controles de
calidad no son los que muchas empresas medianas/grandes poseen, con lo


cual
poderte hacer entender todas estas cosas es un poco dificil


lamentablemente,
pero el dia que te toque desarrollar aplicaciones donde el control de
calidad sea algo serio o donde las exigencias sean otras, te vas a acordar
de muchas de las cosas que decimos en este foro, generalmente los que
estamos aca estamos acostumbrados a trabajar en aplicaciones de nivel
critico con lo cual nuestros consejos son apuntados a esto, se supone que
una empresa si instala un motor de bdd como sqlserver es porque necesita
trabajar de forma corporativa (a menos que uses MSDE) con lo cual los
ambientes corporativos se manejan de una forma muy distinta a la que


muchos
desarrolladores independientes estan acostumbrados, es mas, a mi como
gerente de IT me cuesta mucho conseguir desarrolladores independientes con
cierto nivel de calidad y concepto, con lo cual tuvimos que tomar la
desicion de que los desarrollos los haga una empresa que posea ciertas
cosas.

Bue ya me pase del mensaje, solo queria cerrar el tema, porque parece como
que me estas peliando ;) y estas un poco confundida, aca yo intento
ascesorar y exponer mi experiencia lo maximo que pueda, luego queda en
ustedes si la toman o la dejan, nadie esta obligado a tomar todo lo que se
dice en este foro no?




Su extensa explicacion me da impresion de que en el fondo admite su
contradiccion. Si se fija bien no esta respondiendo lo que puntualmente le
expongo en el mensaje de este hilo. Para mi simplemente se contradice. Y
su razonamiento reiterado en varios mensajes a otros participantes del forum
de supeditar nuestra "ignorancia" en esos temas a que no trabajamos con
grandes corporaciones como usted lo hace (y lo felicitamos por ello) me
parece débil y arriesgado pues usted no nos conoce y hasta podría
sorprenderse de saber el entorno en que hemos desarrollado aplicaciones.
Pero en mi caso particular no es mi interes promocionarlo.

De todos modos, gracias por su tiempo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida