Reemplazar sp que usa sql dinamico

20/05/2009 - 02:50 por CHAR72 | Informe spam
Hola compañeros! emprendo la tarea de reemplazar un sp que usa sql dimamico
por uno que no (no se si podré).

Mi escenario es un SQL2000. Mi principal problema, son los permisos de
SELECTque necesita el sp.

Lei el articulo de Maxi
http://msmvps.com/blogs/maxiaccotto...l2005.aspx
especialmente la parte QUE ES IMPOSIBLE EN SQL2000 el uso de algo similar a
EXECUTE AS en el SQL2000.

Principalmente el sp recibe x parametros (mas de 3 seguro) entonces se arma
el sql segun:

IF @P1 IS NOT NULL
SET @ WHERE=' AND FDATA1=" + @P1

IF @P2 IS NOT NULL
SET @ WHERE=' AND FDATA2=" + @P2


SET @SQL='SELECT " + @WHERE
EXECUTESQL @SQL

(a modo ilustrativo, no es el codigo exacto obvio)

Lei que todo el sql dinamico se podria reemplazar..., en este caso, como lo
podria reemplazar.

Saludos y gracias

Carlos
 

Leer las respuestas

#1 Alejandro Mesa
20/05/2009 - 03:47 | Informe spam
Carlos,

No tomes lo comentado en el articulo de forma textual. Si en tu ambiente no
es problema que los usuarios tengan permiso de lectura sobre las tablas
referenciadas en el procedimiento, entonces no tienes por que cambiarlo.
Tambien pudieras usar un vista y dar permiso de lectura solo en la vista y
usar esta en la llamada dinamica. El uso de sql dinamico se ajusta bien para
este tipo de procedimientos donde los parametros de busqueda son opcionales.

Claro esta, si puedes evitar el sql dinamico y lograr el mismo o mejor
desempenio, entonces seria lo optimo.

Ahora, el codigo que posteastes tiene otros problemas mas delicados como es
la concatenacion de parametros de entrada con la cadena que arma la sentencia.

IF @P1 IS NOT NULL
SET @ WHERE=' AND FDATA1=" + @P1



En este caso debes tratar de parametrizar la sentencia para evitar injeccion
de codigo sql. Usando parametros (chequea sp_executesql en los BOL) tambien
evitas tener que lidear con los apostrofes, conversion de datos para poder
concatenar a la cadena, ademas de ayudar a que los planes de ejecucion
existentes se reusen con mas frecuencia.

IF @P1 IS NOT NULL
SET @WHERE = ' AND FDATA1= @P1';

IF @P2 IS NOT NULL
SET @ WHERE = ' AND FDATA2 = @P2';

...

exec sp_executesql @sql, N'@p1 int, @p2 int', @p1, @p2;

Fijate que estoy usando tipos de data de ejemplo, pues en realidad no
tenemos idea alguno de los tipos de data que usas para @p1, @p2 etc.

En el articulo de Maxi, el hace referencia a otro articulo sobre el correcto
uso de sql dinamico. Te recomiendo que le des una ojeada, pues te ayudara
mucho a entender lo pros y contras de usar sql dinamico.

Si posteas todo el codigo, junto con una descripcion de lo que se desea,
posiblemente podamos sugerir algo.

Este articulo (adjunto el link) explica como lograr busquedas dinamicas en
sql server, que al parecer se adapta bien a tu caso. Digo busqueda dinamica
porque los parametros de entrada pueden ser opcionales.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search-2005.html


AMB


"CHAR72" wrote:

Hola compañeros! emprendo la tarea de reemplazar un sp que usa sql dimamico
por uno que no (no se si podré).

Mi escenario es un SQL2000. Mi principal problema, son los permisos de
SELECTque necesita el sp.

Lei el articulo de Maxi
http://msmvps.com/blogs/maxiaccotto...l2005.aspx
especialmente la parte QUE ES IMPOSIBLE EN SQL2000 el uso de algo similar a
EXECUTE AS en el SQL2000.

Principalmente el sp recibe x parametros (mas de 3 seguro) entonces se arma
el sql segun:

IF @P1 IS NOT NULL
SET @ WHERE=' AND FDATA1=" + @P1

IF @P2 IS NOT NULL
SET @ WHERE=' AND FDATA2=" + @P2
.

SET @SQL='SELECT " + @WHERE
EXECUTESQL @SQL

(a modo ilustrativo, no es el codigo exacto obvio)

Lei que todo el sql dinamico se podria reemplazar..., en este caso, como lo
podria reemplazar.

Saludos y gracias

Carlos



Preguntas similares