PRB: Contesto di protezione di dinamici istruzioni SQL in una stored procedure

Traduzione articoli Traduzione articoli
Identificativo articolo: 301299 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sintomi

Quando si esegue una stored procedure con una query di esecuzione dinamici ( stored procedure sp_executesql o EXECUTE), viene potrebbe essere visualizzato il seguente messaggio di errore:
Server: Messaggio 229, livello 14, stato 5, riga 1 ' permission ' autorizzazione negato per oggetto ' object ' database ' database ' proprietario ' owner '.

Cause

Questo comportamento si verifica poiché viene eseguita una query di esecuzione dinamici ( stored procedure sp_executesql o EXECUTE) in un contesto diverso dalla stored procedure principale, viene eseguito nel contesto di protezione dell'utente che esegue la stored procedure e non nel contesto di protezione del proprietario della stored procedure.

Nota : questo comportamento è necessario prendere in considerazione mentre definire catene di proprietà.

Workaround

Per risolvere questo problema:
  • È necessario concedere correttamente dell'autorizzazione necessaria per ogni oggetto sottostante menzionato nella query di esecuzione dinamici.
  • È possibile eseguire un'istruzione SELECT con la clausola INTO per creare una tabella temporanea che contiene tutti i dati nella tabella originale, quindi scegliere EXEC l'istruzione SQL eseguita nella tabella temporanea. Si tratta di una soluzione valida se le tabelle che si sta utilizzando sono piccole.

Informazioni

Nel codice riportato di seguito viene illustrato il 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'
				
il codice seguente viene riprodotto il problema:
   go
   declare @Sql varchar(500)
   set @Sql = 'select * from employee where Name = ''FunctionFunction'''
   exec TestError @Sql
				
utilizzare il codice riportato di seguito per eliminare il database di dynamicSql di test e l'account di accesso utilizzati in questo scenario di riproduzione:
   go
   setuser 
   use master
   drop database dynamicSql
   exec sp_droplogin  'FunctionFunction'
   exec sp_droplogin 'Function'
				
per ulteriori informazioni su catene di proprietà, vedere Using catene di proprietà nella documentazione in linea di SQL Server.

Proprietà

Identificativo articolo: 301299 - Ultima modifica: giovedì 16 ottobre 2003 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Chiavi: 
kbmt kbprb KB301299 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 301299
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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