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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 CHAR72
20/05/2009 - 22:42 | Informe spam
Se pretende dar solo permisos a sp y no a select, pero como plantee al
principio, solo si es posible reemplazar el sql dinámico.

Tomaré en cuenta lo que tu me aconcejas.

Muy interesante el articulo del link adjunto

Saludos y gracias

Carlos

PD: en el armado del sql usaba "QuoteName"

"Alejandro Mesa" escribió en el
mensaje news:
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



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida