PRB: Contexto de seguridad de dinámicas instrucciones SQL en un procedimiento almacenado

Seleccione idioma Seleccione idioma
Id. de artículo: 301299 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Cuando ejecuta un procedimiento almacenado con una consulta de ejecución dinámica ( sp_executesql o EXECUTE), puede recibir el siguiente mensaje de error:
Servidor: Mensaje 229, nivel 14, estado 5, 1 ' permission ' permiso denegado para el objeto ' object ', base de datos ' database ', propietario ' owner '.

Causa

Este comportamiento se produce porque una consulta de ejecución dinámica ( sp_executesql o EXECUTE) se ejecuta en un contexto separado desde el procedimiento almacenado principal; se ejecuta en el contexto de seguridad del usuario que ejecuta el procedimiento almacenado y no en el contexto de seguridad del propietario del procedimiento almacenado.

Nota : debe tener esto en cuenta mientras se determina las cadenas de propiedad.

Solución

Para evitar este problema:
  • Tiene que conceder el permiso necesario para cada objeto subyacente que se menciona en la consulta de ejecución dinámica de correctamente.
  • Puede ejecutar una instrucción SELECT con la cláusula INTO para crear una tabla temporal que contiene todos los datos de la tabla original y, a continuación, EXEC su instrucción SQL en la tabla temporal. Se trata de una solución viable si las tablas que trabaja con son pequeñas.

Más información

El código siguiente muestra este problema:
   create database dynamicSQL
   go
   use dynamicSQL
   create table employee(Name varchar(255), salary money)
   go
   create proc TestError @MySql nvarchar(500) As 
   exec (@mySql)
   go
   set nocount on
   insert employee select 'FunctionFunction', 100000
   insert employee select 'Function', 30000
   set nocount off
   exec sp_addlogin 'FunctionFunction'
   exec sp_adduser 'FunctionFunction'
   exec sp_addlogin 'Function'
   exec sp_adduser 'Function'

   grant execute on TestError to Function

   setuser 'Function'
				
el siguiente código reproduce este problema:
   go
   declare @Sql varchar(500)
   set @Sql = 'select * from employee where Name = ''FunctionFunction'''
   exec TestError @Sql
				
utilice el siguiente código para colocar la base de datos de prueba dynamicSql y los inicios de sesión utilizados en este escenario de reproducción:
   go
   setuser 
   use master
   drop database dynamicSql
   exec sp_droplogin  'FunctionFunction'
   exec sp_droplogin 'Function'
				
para obtener más información acerca de las cadenas de propiedad, vea Utilizar cadenas de propiedad en los libros en pantalla de SQL Server.

Propiedades

Id. de artículo: 301299 - Última revisión: jueves, 16 de octubre de 2003 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbmt kbprb KB301299 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 301299

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com