В дозволі EXECUTE було відмовлено на об’єкті "xxxxxxx", базі даних "zzzzzzz", схемі "dbo"


187

У мене виникають проблеми з виконанням функції.

Ось що я зробив:

  1. Створіть функцію за допомогою SQL Server Management Studio. Він був успішно створений.
  2. Потім я спробував виконати новостворену функцію, і ось що я отримую:

В дозволі EXECUTE було відмовлено на об’єкті "xxxxxxx", базі даних "zzzzzzz", схемі "dbo".


Якщо у вас є роль db_owner, користувач також може виконувати (не дорівнює наданню exec ...)
hazjack

Я отримав цю помилку, коли в моїй заяві SQL сталася помилка синтаксису. За суті , я злився GOі Createв GOCreate. Інші синтаксичні помилки також видають цю помилку.
Ганеш Камат - 'Код несамовитості'

Відповіді:


163

Здається, що вам потрібно надати дозвіл на виконання користувачеві (або групі, до якої вони входять) для відповідної збереженої процедури.

Наприклад, ви можете надати доступ таким чином:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
Привіт, я знаю, що це було небагато часу тому, але у мене є питання. Може такі дії мають певні проблеми із безпекою? Це відкриває sp, щоб використовуватись для всіх?
Валентин Виноградський

9
Так, це дозволяє кожному, хто має з'єднання з БД, запускати збережену процедуру. Я б очікував, що люди, стурбовані безпекою, нададуть доступ до відповідної групи у своїй базі даних .
Rowland Shaw

7
Ви також GRANT EXEC TO PUBLICможете надати доступ до всіх об’єктів у базі даних
sohaiby

2
Я ніколи не давав би дозволу на виконання публічної ролі. У будь-якому випадку в нашому середовищі було доручено відключити роль громадськості. Я завжди надаю дозволи на виконання конкретному користувачеві або ролі, створеній явно для цієї мети.
користувач1161391

4
чому всі звертаються до коментарів, які пропонують надати ПУБЛІЧНІ права виконувати що-небудь взагалі в базі даних? Це особливий випадок, а не дефакто.
Сб Тіру

111

Найкраще рішення, яке я знайшов, - створити нову роль бази даних, тобто

CREATE ROLE db_executor;

а потім надати на виконання цієї ролі дозвіл.

GRANT EXECUTE TO db_executor;

Тепер, коли ви перейдете до властивостей користувача та перейдете до "Картування користувачів" та виберіть базу даних, де ви додали нову роль, тепер нова роль буде видно у складі ролі баз даних для:

Детальніше читайте повну статтю


8
Ця відповідь найкраща, якщо вам потрібно надати EXECUTE для всіх SP певному входу користувача - без використання public або db_owner. Тут здається найбільш розсудливою і корисною відповіддю.
jcollum

1
Чомусь це єдина відповідь, яка працює для мене на SQL Server 2012. Надання моєму явному користувачеві дозволу EXECUTE не працює. Він працює лише в тому випадку, якщо він успадкував дозвіл через роль.
Кіт

1
Це має бути відповіддю. Це спрацювало як шарм для мене. Дуже дякую!
Шахбааз

Потім додайте його до облікового запису, наприкладEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

У студії управління сервером Sql:

просто піти security->schema->dbo.

Двічі клацніть на dbo, а потім натисніть permission tab->(blue font)view database permissionі не соромтеся прокручувати потрібні поля, наприклад, "execute".Допоможіть собі вибрати grantабо використовувати denyелементи керування. Сподіваюся, це допоможе :)


52

вам потрібно запустити щось подібне

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

4
Це те, що мені потрібно було, але мені довелося зробити це, [domain\user]а не'domain\user'
Пол Стефенсон

45

Це спрацює, якщо ви намагаєтеся надати дозвіл користувачам або ролям.

Використання Microsoft SQL Server Studio Studio:

  1. Перейдіть до: Бази даних
  2. Клацніть правою кнопкою миші на базі dbo.my_database
  3. Виберіть: Властивості
  4. На лівій бічній панелі натисніть на: Дозволи
  5. Виберіть користувача або роль та на панелі імен
  6. Знайдіть Виконати в дозволах і позначці: Грант, З грантом або Заборонити

На жаль, користувач вже виконав дозволи! Ось чому це так заплутано ....
Дуглас Гаскелл

Дякую Кейму, це прекрасно працює, коли я
Рош

16

Надання такого дозволу може бути небезпечним, особливо якщо ваша веб-програма використовує те саме ім'я користувача.

Тепер користувач Інтернету (і всесвітня павутина) також має дозвіл на створення та видалення об'єктів у вашій базі даних. Подумайте про ін'єкцію SQL!

Я рекомендую надавати права доступу Execute лише конкретному користувачеві на даному об'єкті наступним чином:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Тепер користувач myusernameNoquotes може виконувати процедуру storageProcedureNameNoquotes без інших зайвих дозволів на ваші цінні дані.



3

Якщо у вас є такі питання, як питання, задайте вище стосовно виключення, викинутого під час виконання рішення, проблема - це дозвіл, не наданий належним чином користувачам цієї групи для доступу до бази даних / збереженої процедури. Все, що вам потрібно зробити, - це зробити щось на кшталт того, що у мене є нижче, замінивши моє ім’я вашої бази даних, збережені процедури (функції) та тип дозволу чи ролі, або кому ви надаєте доступ.

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

/ ****** Об'єкт: StoredProcedure [dbo]. [GetAllE Employees] Дата сценарію: 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

Ви можете надати дозвіл на виконання всіх:

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

"Загальнодоступне" - це роль бази даних за замовчуванням, до якої належать усі користувачі.


1

Я зіткнувся з тією ж проблемою, і я вирішив, як дати дозвіл db_owner і користувачеві Бази даних.


11
я не думаю, що це гарне рішення ... тому що я не можу надати моєму веб-додатку цей дозвіл .. я не знаю, хто голосує за це
Міна Габріель

7
Не рекомендується, оскільки це дуже небезпечно. Вам слід створити відповідні ролі замість того, щоб використовувати db_owner, який має повний контроль над усією базою даних
Yetiish

1

Якщо ви робите цього користувача особливим для конкретної бази даних, можливо, ви не встановлюєте його як db_owner у "відображенні користувачів" властивостей


1

вам краще змінити ролі сервера, який був розроблений для привілеїв безпеки. додати роль користувача сервера sysadmin. для кращої безпеки у вас можуть бути власні ролі сервера. але такий підхід дасть тобі, що ти зараз хочеш.

  1. Провідник об’єктів -> Сервер -> Безпека -> Логіни
  2. Клацніть правою кнопкою миші потрібного користувача
  3. Перейдіть до серверних ролей ліворуч
  4. Переконайтеся, що позначено sysadmin
  5. Натисніть кнопку OK і перезавантажте свій SQL-сервер

Удачі

введіть тут опис зображення


1
sysadmin - тотальний перебір (і небезпечний)
Trubs

0

ось як надати дозвіл одному користувачеві, який не є загальнодоступним,

Прямий запит:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.