Как вы даете разрешение на выполнение одной хранимой процедуры?

40

Обычно, когда я создаю хранимую процедуру, я использую следующее в качестве шаблона сортировки

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

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

Grant execute [User_Execute] 

... но только для этой хранимой процедуры?

Я видел некоторые другие подобные вопросы, но они, кажется, все относятся ко ВСЕМ хранимым процедурам, а не только к одному, и я не видел ни одного, где вы можете указать разрешения внутри create procedureскрипта. Даже ответы о том, как я могу установить разрешения без графического интерфейса для определенных хранимых процедур, приветствуются.

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

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
DaneEdw
источник
Код, указанный в отредактированном тексте, является действительным и правильным ответом на этот вопрос.
девяносто 9

Ответы:

10

truncate table Установка разрешения для таких объектов, как хранимые процедуры, может быть выполнена с помощью:

GRANT EXECUTE ON <schema>.<object> to <user>;

Однако вы также можете предоставить права безопасности как на уровне входа, так и на уровне пользователя. Вы захотите определить и предоставить ТОЛЬКО необходимые права для объектов, которым требуется доступ (например, выполнение). Рассмотрите возможность использования EXECUTE ASвозможности, которая позволяет олицетворять другого пользователя для проверки прав доступа, необходимых для выполнения кода, БЕЗ необходимости предоставлять все необходимые права всем базовым объектам (например, таблицам). EXECUTE ASмогут быть добавлены к хранимым процедурам, функциям, триггерам и т. д.

Добавьте к коду следующее прямо в хранимой процедуре:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

В этом случае вы выдаете себя за владельца вызываемого модуля. Вы также можете выдавать себя за SELF, ИЛИ за пользователя, создающего или изменяющего модуль, ИЛИ ... выдавать за вызов CALLER, что позволит модулю принимать разрешения текущего пользователя, ИЛИ ... заимствовать УЧАСТНИКА, который получит разрешение от владелец процедуры, которая называется OR ... олицетворяет 'user_name', которая будет выдавать себя за конкретного пользователя ИЛИ ... олицетворяет 'login_name', будет олицетворять конкретный вход в систему.

В большинстве случаев вам нужно будет только предоставить EXECUTEправа на хранимые процессы, а затем права будут предоставлены всем объектам, на которые есть ссылки в хранимом процессе.

Таким образом, вам НЕ НУЖНО предоставлять неявные права (например, для обновления данных или вызова дополнительных процедур). Владение цепочкой обрабатывает это для вас. Это особенно полезно для динамического SQL или если вам нужно создать задачи повышенной безопасности, такие как CREATE TABLE. EXECUTE ASэто удобный инструмент для рассмотрения.

Этот пример может помочь прояснить все это:

Создайте пользователя с именем NoPrivUser с открытым доступом к базе данных (например, dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

ПРИМЕЧАНИЕ. СОЗДАТЕЛЬ ИЛИ ВЛАДЕЛЕЦ ЭТОЙ ПРОЦЕДУРЫ ТРЕБУЕТ СОЗДАТЬ ПРАВА ТАБЛИЦЫ в целевой базе данных.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

В EXECUTE ASпредложении хранимая процедура запускается в контексте владельца объекта. Этот код успешно создается dbo.MyTableи строки вставляются успешно. В этом примере пользователь NoPrivUserабсолютно не имеет предоставленных прав на изменение таблицы или чтение или изменение любых данных в этой таблице.

Он принимает только те права, которые необходимы для выполнения этой конкретной задачи, закодированной в контексте этой процедуры.

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

Ричард Уймет
источник
4
Это тот же самый ответ, который вы опубликовали вчера на SO , который я также должен был отформатировать для удобства чтения.
Аарон Бертран
5

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

выберите базу данных логин -> Перейти к Securable и нажмите кнопку поиска, как на предыдущем изображении. Нажав кнопку «Поиск», вы увидите следующее окно, чтобы добавить тип объекта.

Нажмите кнопку «Типы объектов», и вы увидите окно «Выбор типов объектов» с различными объектами. Теперь, если вы видите, хранимая процедура отображается в области типов объектов. Теперь мы выберем нашу конкретную хранимую процедуру, для которой мы хотим предоставить разрешение.

arnav
источник
Во-первых, вопрос был старше пяти лет, когда вы ответили на него. Это было бы хорошо, за исключением того, что OP специально запрашивал решения, которые не используют графический интерфейс и могут быть встроены в скрипт. Ваш ответ не касается этого.
Эрик Брандт