DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 301299 - Última revisão: quinta-feira, 16 de outubro de 2003 - Revisão: 3.2

 

Sintomas

Quando você está executando um procedimento armazenado com uma consulta de execução dinâmico ( sp_executesql ou EXECUTE), você receberá a seguinte mensagem de erro:
Servidor: Mensagem 229, nível 14, estado 5, linha 1 ' permission ' permissão negada no objeto ' object ', banco de dados ' database ' proprietário ' owner '.

Causa

Esse comportamento ocorre porque executa uma consulta de execução dinâmico ( sp_executesql ou EXECUTE) em um contexto separado do procedimento armazenado principal; ele é executado no contexto de segurança do usuário que executa o procedimento armazenado e não no contexto de segurança do proprietário do procedimento armazenado.

Observação : você deve considerar esse comportamento enquanto são determinar cadeias de propriedade.

Como Contornar

Para contornar esse problema:
  • Você precisa conceder a permissão necessária para cada objeto subjacente mencionada na consulta de execução dinâmico corretamente.
  • Você pode executar uma instrução SELECT com a cláusula INTO para criar uma tabela temporária que contém todos os dados na tabela original e, em seguida, EXEC sua instrução SQL em relação a tabela temporária. Isso é uma solução viável se as tabelas que você está lidando com são pequenas.

Mais Informações

O código a seguir demonstra esse 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'
				
o seguinte código reproduz esse problema:
   go
   declare @Sql varchar(500)
   set @Sql = 'select * from employee where Name = ''FunctionFunction'''
   exec TestError @Sql
				
usar o código a seguir para descartar o banco de dados de teste dynamicSql e logons usados neste cenário reprodução:
   go
   setuser 
   use master
   drop database dynamicSql
   exec sp_droplogin  'FunctionFunction'
   exec sp_droplogin 'Function'
				
para obter mais informações sobre cadeias de propriedade, consulte Usando cadeias de propriedade nos manuais online do SQL Server.

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbprb KB301299 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 301299  (http://support.microsoft.com/kb/301299/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store