Разрешение 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
Да, он позволяет любому, кто подключен к БД, запускать хранимую процедуру. Я ожидаю, что люди, обеспокоенные безопасностью, предоставят доступ к соответствующей группе в своей базе данных .
Роуланд Шоу

7
Вы также можете использовать GRANT EXEC TO PUBLICдля предоставления доступа ко всем объектам в базе данных
sohaiby

2
Я бы никогда не предоставил права на исполнение публичной роли. В любом случае в нашей среде было предписано отключить общественную роль. Я всегда даю разрешения на выполнение определенному пользователю или роли, созданной специально для этой цели.
user1161391

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

111

Лучшее решение, которое я нашел, это создать новую роль базы данных, т.е.

CREATE ROLE db_executor;

и затем предоставьте этой роли разрешение exec.

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 Server Management Studio:

просто иди к 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 Management Studio:

  1. Перейти к: Базы данных
  2. Щелкните правой кнопкой мыши на dbo.my_database
  3. Выберите: Свойства
  4. На левой боковой панели нажмите: Разрешения
  5. Выберите пользователя или роль и в панели имен
  6. Найти Выполнить в разрешениях и галочку: Предоставить, Предоставить или Запретить

К сожалению, у пользователя уже есть права на выполнение! Вот почему это так сбивает с толку ....
Дуглас Гаскелл

Спасибо Кейм, это работает отлично, когда я отмечаю Грант
Рош

16

Предоставление такого разрешения может быть опасным, особенно если ваше веб-приложение использует то же имя пользователя.

Теперь веб-пользователь (и вся всемирная паутина) также имеет право создавать и удалять объекты в вашей базе данных. Подумайте, SQL-инъекция!

Я рекомендую предоставить права на выполнение только конкретному пользователю для данного объекта следующим образом:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Теперь пользователь myusernameNoquotes может выполнять процедуру хранимуюProcedureNameNoquotes без других ненужных разрешений на ваши ценные данные.



3

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

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

/ ****** Объект: StoredProcedure [dbo]. [GetAllEmployees] Дата сценария: 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]

«Public» - это роль базы данных по умолчанию, членом которой являются все пользователи.


1

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


11
я не думаю, что это хорошее решение ... потому что я не могу дать своему веб-приложению разрешение ... я не знаю, кто за это проголосовал
Мина Габриэль

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

1

Если вы сделаете этого пользователя особенным для конкретной базы данных, то, возможно, вы не установите его как db_owner в «сопоставлении пользователей» свойств


1

Вам лучше изменить серверные роли, которые были разработаны для привилегий безопасности. добавьте роль сервера sysadmin своему пользователю. для большей безопасности у вас могут быть свои пользовательские роли сервера. но этот подход даст вам то, что вы хотите сейчас.

  1. Обозреватель объектов -> Сервер -> Безопасность -> Логины
  2. Щелкните правой кнопкой мыши на нужном пользователе
  3. Перейти к роли сервера на левой стороне
  4. Убедитесь, что sysadmin проверен
  5. Нажмите OK и перезапустите ваш SQL-сервер

Удачи

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


1
Сисадмин - это полный перебор (и это опасно)
Сисадмин полностью перебит

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.