Izin EXECUTE ditolak pada objek 'xxxxxxx', basis data 'zzzzzzz', skema 'dbo'

187

Saya mengalami masalah dalam menjalankan suatu fungsi.

Inilah yang saya lakukan:

  1. Buat fungsi menggunakan SQL Server Management Studio. Itu berhasil dibuat.
  2. Saya kemudian mencoba menjalankan fungsi yang baru dibuat dan inilah yang saya dapatkan:

Izin EXECUTE ditolak pada objek 'xxxxxxx', basis data 'zzzzzzz', skema 'dbo'.

upendra parmar
sumber
Jika memiliki peran db_owner, pengguna dapat mengeksekusi juga (tidak sama dengan memberikan eksekutif ...)
hazjack
Saya mendapatkan kesalahan ini ketika ada kesalahan sintaksis dalam Pernyataan SQL saya. Pada dasarnya saya telah bergabung GOdan Createmenjadi GOCreate. Kesalahan sintaksis lain juga tampaknya memberikan kesalahan ini.
Ganesh Kamath - 'Code Frenzy'

Jawaban:

163

Kedengarannya seperti Anda perlu memberikan izin eksekusi kepada pengguna (atau grup yang menjadi bagiannya) untuk prosedur tersimpan yang dimaksud.

Misalnya, Anda dapat memberikan akses:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
sumber
2
Hai, saya tahu itu beberapa waktu yang lalu, tapi saya punya pertanyaan. Mungkinkah tindakan semacam itu memiliki beberapa masalah keamanan? Apakah itu membuka sp untuk digunakan untuk semua orang?
Valentyn Vynogradskiy
9
Ya, itu memungkinkan siapa pun yang memiliki koneksi ke DB menjalankan prosedur yang tersimpan. Saya berharap orang-orang khawatir tentang keamanan untuk memberikan akses ke grup yang relevan dalam database mereka .
Rowland Shaw
7
Anda juga dapat menggunakan GRANT EXEC TO PUBLICuntuk memberikan akses ke semua objek dalam basis data
sohaiby
2
Saya tidak akan pernah memberikan izin eksekusi ke peran publik. Apa pun cara di lingkungan kita dimandatkan bahwa peran publik dinonaktifkan. Saya selalu memberikan izin eksekusi kepada pengguna tertentu atau peran yang dibuat secara eksplisit untuk tujuan ini.
user1161391
4
mengapa semua orang mendukung komentar yang menyarankan pemberian hak PUBLIK untuk melakukan apa saja dalam database? Itu kasus khusus bukan defacto.
Sab Thiru
111

Solusi terbaik yang saya temukan adalah membuat peran basis data baru yaitu

CREATE ROLE db_executor;

dan kemudian memberikan izin eksekutif peran itu.

GRANT EXECUTE TO db_executor;

Sekarang ketika Anda pergi ke properti pengguna dan pergi ke Pemetaan Pengguna dan pilih database tempat Anda telah menambahkan peran baru, sekarang peran baru akan terlihat di keanggotaan peran Database untuk: bagian

Untuk lebih detail baca artikel lengkap

Kazim
sumber
8
Jawaban ini paling baik jika Anda perlu memberikan EXECUTE untuk semua SP ke login pengguna tertentu - tanpa menggunakan publik atau db_owner. Sepertinya jawaban yang paling bijaksana dan berguna di sini.
jcollum
1
Untuk beberapa alasan ini adalah satu-satunya jawaban yang berfungsi untuk saya di SQL Server 2012. Memberi saya izin EXECUTE eksplisit tidak berfungsi. Ini hanya berfungsi jika mewarisi izin melalui peran.
Keith
1
Ini seharusnya jawabannya. Itu bekerja seperti pesona bagi saya. Terima kasih banyak!
Shahbaaz
Kemudian tambahkan ke akun sepertiEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan
72

Di Sql Server Management Studio:

pergilah ke security->schema->dbo.

Klik dua kali dbo, lalu klik permission tab->(blue font)view database permissiondan merasa bebas untuk menggulir ke bidang yang diperlukan seperti "execute".Bantu sendiri untuk memilih menggunakan grantatau denykontrol. Semoga ini bisa membantu :)

Suhail Mumtaz Awan
sumber
52

Anda perlu menjalankan sesuatu seperti ini

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
sumber
4
Inilah yang saya butuhkan, tetapi saya harus lakukan [domain\user]daripada'domain\user'
Paul Stephenson
45

Ini akan berfungsi jika Anda mencoba untuk memberikan izin kepada Pengguna atau peran.

Menggunakan Microsoft SQL Server Management Studio:

  1. Pergi ke: Database
  2. Klik kanan pada dbo.my_database
  3. Pilih: Properti
  4. Di panel sebelah kiri, klik pada: Izin
  5. Pilih Pengguna atau Peran dan di Panel Nama
  6. Temukan Jalankan di dalam izin dan centang: Hibah, Dengan Hibah, atau Tolak
csebryam
sumber
Sayangnya, pengguna sudah menjalankan izin! Itulah sebabnya ini sangat membingungkan ....
Douglas Gaskell
Terima kasih Keim ini berfungsi dengan baik ketika saya menandai tanda centang Grant
Rosh
16

Memberi izin semacam itu bisa berbahaya, terutama jika aplikasi web Anda menggunakan nama pengguna yang sama.

Sekarang pengguna web (dan web seluruh dunia) juga memiliki izin untuk membuat dan menjatuhkan objek dalam basis data Anda. Pikirkan SQL Injection!

Saya merekomendasikan pemberian Execute privilege hanya untuk pengguna tertentu pada objek yang diberikan sebagai berikut:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Sekarang pengguna myusernameNoquotes dapat menjalankan prosedur yang tersimpanProcedureNameNoquotes tanpa izin lain yang tidak perlu ke data berharga Anda.

AMAR PANRAY
sumber
8

Anda tidak memiliki hak untuk mengeksekusinya, meskipun Anda memiliki cukup izin untuk membuatnya.

Untuk informasi lebih lanjut, lihat Izin Objek GRANT (Transact-SQL)

Denis Valeev
sumber
3

Jika Anda memiliki masalah seperti pertanyaan yang diajukan di atas mengenai pengecualian yang dilemparkan ketika solusi dieksekusi, masalahnya adalah izin, tidak diberikan dengan benar kepada pengguna grup itu untuk mengakses database / prosedur tersimpan. Yang perlu Anda lakukan adalah melakukan sesuatu seperti apa yang saya miliki di bawah ini, mengganti tambang dengan nama database Anda, prosedur (fungsi) yang tersimpan, dan jenis izin atau peran atau kepada siapa Anda memberikan akses.

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

/ ****** Objek: StoredProcedure [dbo]. [GetAllEmployees] Tanggal Skrip: 01/27/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
Okwo moses
sumber
2

Anda dapat memberikan izin eksekusi kepada semua orang:

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

"Publik" adalah peran basis data default yang menjadi anggota semua pengguna.

philu
sumber
1

Saya telah menghadapi masalah yang sama dan saya memecahkan juga memberikan izin db_owner kepada pengguna Database.

Singaravelan
sumber
11
saya tidak berpikir ini adalah solusi yang baik ... karena saya tidak bisa memberikan izin aplikasi web saya ini .. saya tidak tahu siapa yang memilih ini
Mina Gabriel
7
Tidak direkomendasikan, karena ini sangat tidak aman. Anda harus membuat peran yang tepat alih-alih menggunakan db_owner yang memiliki kontrol penuh atas seluruh basis data
Yetiish
1

Jika Anda membuat pengguna ini terutama untuk database tertentu, maka mungkin Anda tidak menetapkannya sebagai db_owner di "pemetaan pengguna" properti.

Fatemeh M. Rezaie
sumber
1

Anda sebaiknya memodifikasi peran server, yang dirancang untuk hak keamanan. tambahkan peran server sysadmin ke pengguna Anda. untuk keamanan yang lebih baik Anda mungkin memiliki peran server khusus Anda. tetapi pendekatan ini akan memberi Anda apa yang Anda inginkan untuk saat ini.

  1. Obyek Explorer -> Server -> Keamanan -> Login
  2. Klik kanan pada pengguna yang Anda inginkan
  3. Pergi ke Peran Server di sisi kiri
  4. Pastikan sysadmin dicentang
  5. Tekan OK dan mulai ulang server SQL Anda

Semoga berhasil

masukkan deskripsi gambar di sini

Ali Kashanchi
sumber
1
sysadmin benar-benar berlebihan (dan berbahaya)
Trubs
0

di sini adalah bagaimana memberikan izin kepada satu pengguna bukan publik,

Permintaan Langsung:

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

Mando Basha
sumber