DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 301299 - Última revisão: quinta-feira, 16 de Outubro de 2003 - Revisão: 3.2

 

Sintomas

Quando estiver a executar um procedimento armazenado com uma consulta de execução dinâmicos ( sp_executesql ou EXECUTE), poderá receber a seguinte mensagem de erro:
Servidor: Erro 229, nível 14, 5 de estado, linha 1 ' permission ' permissão negada no objecto ' object ', base de dados ' database ', ' owner ' do proprietário.

Causa

Este comportamento ocorre porque uma consulta de execução dinâmicos ( sp_executesql ou EXECUTE) é executado num contexto diferente do procedimento principal; executa no contexto de segurança do utilizador que executa o procedimento armazenado e não no contexto de segurança do proprietário do procedimento armazenado.

Nota : É deverá ter este comportamento em consideração enquanto são determinar cadeias de propriedade.

Como contornar

Para contornar este problema:
  • Tem de correctamente conceder a permissão necessária para cada objecto subjacente que é mencionado na consulta execução dinâmico.
  • 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, a instrução de SQL contra a tabela temporária da execução. Esta é uma solução viável se as tabelas que está a lidar com pequenas.

Mais Informação

O seguinte código demonstra 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'
				
o seguinte código reproduz este problema:
   go
   declare @Sql varchar(500)
   set @Sql = 'select * from employee where Name = ''FunctionFunction'''
   exec TestError @Sql
				
utilize o seguinte código para a base de dados do teste dynamicSql e inícios de sessão utilizados neste cenário de 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 Utilizar cadeias de propriedade no SQL Server Books Online.

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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft