Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
Юзер на сервере сейчас имеет права db_datareader на одну из баз.

В базе master создаю процедуру, которую ему необходимо иметь возможность выполнять (процедура возвращает результат SELECT-a):

ALTER PROCEDURE [dbo].[MyProc]
WITH EXECUTE AS OWNER
AS
...
SELECT ...


В свойствах процедуры даю ему права на ее выполнение, однако при попытке ее запуска юзер получает:

The user does not have permission to perform this action.

Что сделано не так?
28 авг 18, 16:11    [21656506]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
boltnik
Member

Откуда: Калуга/Москва
Сообщений: 144
ALTER PROCEDURE [dbo].[MyProc]
WITH EXECUTE AS OWNER
AS
...
SELECT ...
end

grant execute on MyProc to MyUser
28 авг 18, 16:40    [21656574]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
aleks222
Member

Откуда:
Сообщений: 855
AndrF
Юзер на сервере сейчас имеет права db_datareader на одну из баз.

В базе master создаю процедуру, которую ему необходимо иметь возможность выполнять (процедура возвращает результат SELECT-a):

ALTER PROCEDURE [dbo].[MyProc]
WITH EXECUTE AS OWNER
AS
...
SELECT ...


В свойствах процедуры даю ему права на ее выполнение, однако при попытке ее запуска юзер получает:

The user does not have permission to perform this action.

Что сделано не так?


Прямо таки ваш зверь есть в списке пользователей базы master?
Да вы, батенька, извращенец.
28 авг 18, 16:47    [21656602]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
boltnik
grant execute on MyProc to MyUser


Ну это было выставлено в свойствах процедуры - я изначально писал об этом. Так что нужно еще что-то.
28 авг 18, 17:15    [21656650]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
aleks222
Прямо таки ваш зверь есть в списке пользователей базы master?
Да вы, батенька, извращенец.


Давайте не будем обсуждать кто извращенец, а кто нет и зачем это нужно. Если не знаете ответа на вопрос, то лучше не пишите чем тупо флудить.
28 авг 18, 17:17    [21656654]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
msLex
Member

Откуда:
Сообщений: 7734
AndrF
aleks222
Прямо таки ваш зверь есть в списке пользователей базы master?
Да вы, батенька, извращенец.


Давайте не будем обсуждать кто извращенец, а кто нет и зачем это нужно. Если не знаете ответа на вопрос, то лучше не пишите чем тупо флудить.


Вам нужно "пробросить" владельца процедуры [dbo].[MyProc] из одной базы в другую.
Смотри в сторону trustworthy у базы мастер
28 авг 18, 17:20    [21656657]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
msLex,

ну или db_chaining включить, есди речь идёт именно о кросс базовам запросе
28 авг 18, 17:23    [21656663]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
msLex
Member

Откуда:
Сообщений: 7734
TaPaK
msLex,

ну или db_chaining включить, есди речь идёт именно о кросс базовам запросе


Если владельцем процедуры является dbo (а это скорее всего так) то WITH EXECUTE AS OWNER переводит контекст выполнения в dbo и без trustworthy вы его не пробросите за пределы базы.
28 авг 18, 17:40    [21656686]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
AndrF
...


без db chaining, trustworthy
28 авг 18, 17:45    [21656697]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
TaPaK
msLex,

ну или db_chaining включить, если речь идёт именно о кросс базовам запросе


Э... Немного уточню - речь юзере с windows авторизацией, а не sql.
28 авг 18, 23:15    [21656986]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
AndrF
Э... Немного уточню - речь юзере с windows авторизацией, а не sql.
Существенное пояснение, прям все встало на свои места.

З.Ы. У юзеров нет вообще никакой аутентификации. Юзеры -- это сущность базы данных, на которую навешиваются права в рамках этой же базы данных, и не более.
29 авг 18, 02:58    [21657042]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
В общем, опишу свой вариант решения.

Сама по себе процедура, которую нужно вызывать юзеру вот эта:

ALTER PROCEDURE [dbo].[WhoIsActive]
WITH EXECUTE AS 'sys_adm'
AS
EXEC sp_WhoIsActive @get_plans  = 1, @get_full_inner_text  = 0 ,@get_outer_command  = 1, @get_transaction_info  = 1 ,@output_column_list  =
 '[start_time][dd%][session_id][blocking_session_id][status][login_name][database_name][program_name][host_name][percent_complete][sql_command] 
[sql_text][sql_command][query_plan][cpu%][temp%][reads%][writes%][context%][physical%][locks]'


Где sp_WhoIsActive - довольно известная процедура, размещена в master.

WhoIsActive - в msdb и на нее даны права EXECUTE юзеру MyDomain\MyUser.

В таком варианте все заработало - юзер выполняет EXEC msdb..[WhoIsActive] и получает нужный результат.
29 авг 18, 11:12    [21657285]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно дать права юзеру на процедуру  [new]
AndrF
Member

Откуда:
Сообщений: 2183
В общем, опишу свой вариант решения.

Сама по себе процедура, которую нужно вызывать юзеру вот эта:

ALTER PROCEDURE [dbo].[WhoIsActive]
WITH EXECUTE AS 'sys_adm'
AS
EXEC sp_WhoIsActive @get_plans  = 1, @get_full_inner_text  = 0 ,@get_outer_command  = 1, @get_transaction_info  = 1 ,@output_column_list  =
 '[start_time][dd%][session_id][blocking_session_id][status][login_name][database_name][program_name][host_name][percent_complete][sql_command] 
[sql_text][sql_command][query_plan][cpu%][temp%][reads%][writes%][context%][physical%][locks]'


Где sp_WhoIsActive - довольно известная процедура, размещена в master.

WhoIsActive - в msdb и на нее даны права EXECUTE юзеру MyDomain\MyUser.

В таком варианте все заработало - юзер выполняет EXEC msdb..[WhoIsActive] и получает нужный результат.
29 авг 18, 11:12    [21657286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить