L'autorizzazione EXECUTE è stata negata sull'oggetto 'xxxxxxx', sul database 'zzzzzzz', sullo schema 'dbo'


187

Sto riscontrando problemi nell'esecuzione di una funzione.

Ecco cosa ho fatto:

  1. Creare una funzione utilizzando SQL Server Management Studio. È stato creato con successo.
  2. Ho quindi provato a eseguire la funzione appena creata ed ecco cosa ottengo:

L'autorizzazione EXECUTE è stata negata sull'oggetto 'xxxxxxx', sul database 'zzzzzzz', sullo schema 'dbo'.


Se ha il ruolo db_owner, l'utente può anche eseguire (non equivale a concedere exec ...)
hazjack

Ho ricevuto questo errore quando si è verificato un errore di sintassi nella mia istruzione SQL. Essenzialmente avevo fusa GOe Createin GOCreate. Anche altri errori di sintassi sembrano dare questo errore.
Ganesh Kamath - "Code Frenzy",

Risposte:


163

Sembra che tu debba concedere l'autorizzazione di esecuzione all'utente (o a un gruppo di cui fanno parte) per la procedura memorizzata in questione.

Ad esempio, è possibile concedere l'accesso in questo modo:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
Ciao, so che è stato un po 'di tempo fa, ma ho una domanda. Tale azione potrebbe avere alcuni problemi di sicurezza? Si apre sp per essere utilizzato per tutti?
Valentyn Vynogradskiy,

9
Sì, consente a chiunque disponga di una connessione al DB di eseguire la procedura memorizzata. Mi aspetto che le persone preoccupate per la sicurezza concedano l'accesso al gruppo interessato nel loro database .
Rowland Shaw,

7
È inoltre possibile utilizzare GRANT EXEC TO PUBLICper concedere l'accesso a tutti gli oggetti nel database
sohaiby,

2
Non concederei mai autorizzazioni di esecuzione per il ruolo pubblico. In ogni modo nel nostro ambiente era obbligatorio disabilitare il ruolo pubblico. Concedo sempre le autorizzazioni di esecuzione a un utente specifico o a un ruolo creato esplicitamente per questo scopo.
user1161391

4
perché tutti promuovono commenti che suggeriscono di concedere i diritti PUBBLICI per eseguire qualsiasi cosa in un database? Questo è un caso speciale, non il defacto.
Sab Thiru

111

La migliore soluzione che ho trovato è creare un nuovo ruolo nel database, ad es

CREATE ROLE db_executor;

e quindi concedere l'autorizzazione a tale ruolo.

GRANT EXECUTE TO db_executor;

Ora quando vai alle proprietà dell'utente e vai su Mappatura utente e selezioni il database in cui hai aggiunto un nuovo ruolo, ora un nuovo ruolo sarà visibile nell'appartenenza al ruolo Database per: sezione

Per maggiori dettagli leggi l'articolo completo


8
Questa risposta è la migliore se devi concedere EXECUTE per tutti gli SP a un determinato accesso utente, senza usare public o db_owner. Sembra la risposta più prudente e utile qui.
jcollum,

1
Per qualche motivo questa è l'unica risposta che funziona per me su SQL Server 2012. Dare al mio utente l'autorizzazione EXECUTE esplicita non funziona. Funziona solo se eredita l'autorizzazione attraverso un ruolo.
Keith,

1
Questa dovrebbe essere la risposta. Ha funzionato come un incanto per me. Molte grazie!
Shahbaaz,

Quindi aggiungilo all'account comeEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan il

72

In SQL Server Management Studio:

vai a security->schema->dbo.

Fai doppio clic su dbo, quindi fai clic su permission tab->(blue font)view database permissione sentiti libero di scorrere per i campi richiesti come "execute".Aiutati a scegliere usando granto i denycontrolli. Spero che questo possa aiutare :)


52

devi eseguire qualcosa del genere

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

4
Questo era ciò di cui avevo bisogno, ma dovevo fare [domain\user]piuttosto che'domain\user'
Paul Stephenson,

45

Questo funzionerà se stai cercando di concedere l'autorizzazione a Utenti o ruoli.

Utilizzando Microsoft SQL Server Management Studio:

  1. Vai a: Database
  2. Fare clic con il tasto destro su dbo.my_database
  3. Scegli: Proprietà
  4. Nel pannello laterale sinistro, fai clic su: Autorizzazioni
  5. Seleziona l'utente o il ruolo e nel pannello dei nomi
  6. Trova Esegui in autorizzazioni e segno di spunta: Concedi, Con concedi o Nega

Sfortunatamente, l'utente ha già eseguito le autorizzazioni! Ecco perché è così confuso ....
Douglas Gaskell,

Grazie Keim, questo funziona perfettamente quando spunta Grant
Rosh

16

Concedere tale autorizzazione può essere pericoloso, soprattutto se l'applicazione Web utilizza lo stesso nome utente.

Ora l'utente Web (e l'intero World Wide Web) ha anche il permesso di creare e rilasciare oggetti all'interno del database. Pensa a SQL Injection!

Consiglio di concedere i privilegi Execute solo all'utente specifico sull'oggetto indicato come segue:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Ora l'utente myusernameNoquotes può eseguire la procedura storedProcedureNameNoquotes senza altre autorizzazioni inutili per i tuoi dati preziosi.



3

Se si verificano problemi come la domanda precedente relativa all'eccezione generata durante l'esecuzione della soluzione, il problema è l'autorizzazione, non correttamente concessa agli utenti di quel gruppo per accedere al database / procedura memorizzata. Tutto quello che devi fare è fare qualcosa di simile a quello che ho di seguito, sostituendo il mio con il nome del tuo database, le procedure memorizzate (funzione) e il tipo di autorizzazione o ruolo o a chi stai concedendo l'accesso.

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** Oggetto: StoredProcedure [dbo]. [GetAllEmployees] Data script: 27/01/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

Puoi dare a tutti l'esecuzione dei permessi:

GRANT Execute on [dbo].your_object to [public]

"Pubblico" è il ruolo predefinito del database di cui fanno parte tutti gli utenti.


1

Ho riscontrato lo stesso problema e ho risolto come dare anche l'autorizzazione db_owner all'utente del database.


11
non penso che questa sia una buona soluzione ... perché non posso concedere questa autorizzazione alla mia applicazione web .. non so chi voterà questo
Mina Gabriel,

7
Non raccomandato, poiché questo è molto insicuro. Dovresti creare ruoli appropriati invece di usare db_owner che ha il pieno controllo dell'intero database
Yetiish,

1

Se rendi questo utente speciale per un database specifico, forse non lo imposti come db_owner nella "mappatura utente" delle proprietà


1

faresti meglio a modificare i ruoli del server, progettato per i privilegi di sicurezza. aggiungi il ruolo del server sysadmin al tuo utente. per una migliore sicurezza potresti avere i tuoi ruoli del server personalizzati. ma questo approccio ti darà quello che vuoi per ora.

  1. Esplora oggetti -> Server -> Sicurezza -> Login
  2. Fare clic con il tasto destro del mouse sull'utente desiderato
  3. Vai a Ruoli del server sul lato sinistro
  4. Assicurati che sysadmin sia selezionato
  5. Premi OK e riavvia il tuo server SQL

In bocca al lupo

inserisci qui la descrizione dell'immagine


1
sysadmin è un overkill totale (e pericoloso)
Trubs il

0

ecco come concedere l'autorizzazione per un utente non pubblico,

Query diretta:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.