'Xxxxxxx' nesnesi, 'zzzzzzz' veritabanı, 'dbo' şeması üzerinde EXECUTE izni reddedildi


187

Bir işlevi yürütürken sorunlar yaşıyorum.

İşte yaptım:

  1. SQL Server Management Studio'yu kullanarak bir işlev oluşturun. Başarıyla oluşturuldu.
  2. Daha sonra yeni oluşturulan işlevi yürütmeyi denedim ve işte ne elde edeceğim:

'Xxxxxxx' nesnesi, 'zzzzzzz' veritabanı, 'dbo' şeması üzerinde EXECUTE izni reddedildi.


Db_owner rolüne sahipse, kullanıcı yürütme de yapabilir (exec vermek için eşit değildir ...)
hazjack

Benim SQL deyiminde bir sözdizimi hatası olduğunda bu hatayı aldım. Esasen ben birleşti GOve Createiçine GOCreate. Diğer sözdizimi hataları da bu hatayı veriyor gibi görünüyor.
Ganesh Kamath - 'Code Frenzy'

Yanıtlar:


163

Söz konusu saklı yordam için kullanıcıya (veya parçası oldukları gruba) yürütme izni vermeniz gerektiği anlaşılıyor.

Örneğin, şu şekilde erişim izni verebilirsiniz :

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
Merhaba, biraz zaman önce olduğunu biliyorum, ama bir sorum var. Böyle bir eylemde bazı güvenlik sorunları olabilir mi? Herkes için kullanılmak üzere sp açılıyor mu?
Valentyn Vynogradskiy

9
Evet, DB bağlantısı olan herkesin saklı yordamı çalıştırmasına izin verir. Güvenlik konusunda endişeli olan kişilerin veritabanlarındaki ilgili gruba erişim vermelerini beklerdim .
Rowland Shaw

7
GRANT EXEC TO PUBLICVeritabanındaki tüm nesnelere erişim vermek için de kullanabilirsiniz
sohaiby

2
Asla kamu görevine yürütme izni vermem. Çevremizde herhangi bir şekilde kamu rolünün devre dışı bırakılması zorunlu kılındı. Her zaman belirli bir kullanıcıya veya bu amaçla açıkça oluşturulan bir role yürütme izinleri veririm.
user1161391

4
neden herkes bir veritabanında herhangi bir şey yürütmek için KAMU haklarını vermeyi öneren yorumları destekliyor? Bu özel bir durum değil.
Sat Thiru

111

Bulduğum en iyi çözüm yani yeni bir veritabanı rolü oluşturmaktır

CREATE ROLE db_executor;

ve sonra bu role exec izni verin.

GRANT EXECUTE TO db_executor;

Artık kullanıcının özelliklerine gidip Kullanıcı Eşleme'ye gidip yeni rol eklediğiniz veritabanını seçtiğinizde, şu anda Veritabanı rolü üyeliğinde yeni rol görünecektir: bölümü

Daha fazla ayrıntı için makalenin tamamını okuyun


8
Herkese açık veya db_owner kullanmadan, tüm SP'ler için belirli bir kullanıcı oturumuna EXECUTE vermeniz gerekiyorsa bu yanıt en iyisidir. Buradaki en ihtiyatlı ve yararlı cevap gibi görünüyor.
jcollum

1
Herhangi bir nedenle bu benim için SQL Server 2012'de çalışan tek yanıttır. Kullanıcıma açık EXECUTE izni vermek işe yaramıyor. Yalnızca bir rol aracılığıyla izni devralırsa çalışır.
Keith

1
Cevap bu olmalı. Benim için bir cazibe gibi çalıştı. Çok teşekkürler!
Shahbaaz

Sonra hesaba ekleyinEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

Sql Server Management Studio'da:

sadece gidin security->schema->dbo.

Dbo'yu çift tıklayın, ardından tıklayın permission tab->(blue font)view database permissionve "execute".kullanarak grantveya denykontrolleri seçmeniz için kendinize yardımcı olun gibi gerekli alanları kaydırın . Umarım bu yardımcı olur :)


52

böyle bir şey çalıştırman gerek

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

4
İhtiyacım olan buydu, ama bunun [domain\user]yerine yapmak zorundaydım'domain\user'
Paul Stephenson

45

Bu, Kullanıcılara veya rollere izin vermeye çalışıyorsanız çalışır.

Microsoft SQL Server Management Studio'yu kullanma:

  1. Veritabanlarına gidin
  2. Dbo.my_database üzerinde sağ tıklayın
  3. Seçin: Özellikler
  4. Sol taraftaki panelde şunu tıklayın: İzinler
  5. Kullanıcı veya Rolü seçin ve Ad Panelinde
  6. Yürütme izinlerinde ve onay işaretinde bulun : Hibe, Hibe veya Reddet

Ne yazık ki, kullanıcının zaten izinleri var! Bu yüzden bu çok kafa karıştırıcı ....
Douglas Gaskell

Teşekkürler Keim Grant
Rosh

16

Böyle bir izin vermek, özellikle de web uygulamanız aynı kullanıcı adını kullanıyorsa tehlikeli olabilir.

Artık web kullanıcısı (ve tüm dünya çapında web) de veritabanınız içinde nesne oluşturma ve bırakma iznine sahiptir. SQL Enjeksiyonunu düşünün!

Yürütme ayrıcalıklarını yalnızca verilen nesne üzerinde belirli bir kullanıcıya aşağıdaki gibi vermenizi öneririm:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Artık kullanıcı myusernameNoquotes, değerli verilerinize gereksiz izinler olmadan saklananProcedureNameNoquotes yordamını yürütebilir.



3

Çözüm yürütülürken atılan istisna ile ilgili yukarıdaki soru gibi sorunlarınız varsa, sorun, bu grubun kullanıcılarına veritabanına / saklı yordama erişmek için düzgün bir şekilde verilmez izin verilir. Yapmanız gereken tek şey, benim veritabanı adı, saklı yordamlar (işlev) ve izin veya rol türü veya erişim verdiğiniz kim yerine benim yerine aşağıdaki gibi bir şey yapmaktır.

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

/ ****** Nesne: StoredProcedure [dbo]. [GetAllEmployees] Metin Tarihi: 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

2

Herkese infaz izni verebilirsiniz:

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

"Genel", tüm kullanıcıların üyesi olduğu varsayılan veritabanı rolüdür.


1

Aynı sorunla karşı karşıya kaldım ve Veritabanı kullanıcısına da db_owner izni verdim.


11
Bunun iyi bir çözüm olduğunu düşünmüyorum ... çünkü web uygulamama bu izni veremiyorum .. kimin oy verdiğini bilmiyorum
Mina Gabriel

7
Bu çok güvensiz olduğu için önerilmez. Tüm veritabanı üzerinde tam denetime sahip olan db_owner'ı kullanmak yerine uygun roller oluşturmalısınız
Yetiish

1

Bu kullanıcıyı belirli bir veritabanı için özel yaparsanız, özelliklerin "kullanıcı eşlemesinde" db_owner olarak ayarlanmamış olabilirsiniz.


1

güvenlik ayrıcalıkları için tasarlanmış sunucu rollerini değiştirmekten daha iyi olur. sysadmin sunucu rolünü kullanıcılarınıza ekleyin. daha iyi güvenlik için özel sunucu rollerinize sahip olabilirsiniz. ancak bu yaklaşım size şimdilik istediğinizi verecektir.

  1. Nesne Gezgini -> Sunucu -> Güvenlik -> Girişler
  2. İstediğiniz kullanıcıyı sağ tıklayın
  3. Sol taraftaki Sunucu Rolleri'ne gidin
  4. Sistemadmin'in işaretli olduğundan emin olun
  5. Tamam'a basın ve SQL sunucunuzu yeniden başlatın

İyi şanslar

resim açıklamasını buraya girin


1
sysadmin toplam overkill (ve tehlikeli)
Trubs

0

herkese açık olmayan bir kullanıcıya nasıl izin verileceği,

Doğrudan Sorgu:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.