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

Откуда:
Сообщений: 179
Добрый день! вопрос следующий:

создал процедуру (упрощенный вариант):

CREATE PROCEDURE dbo.[rep_TEST] 
  (
    @cnt  int = 1
  )
AS
  set nocount on

  declare @nsql nvarchar(1000)
  
  set @nsql = 'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
  
  exec sp_executesql @nsql

GO
grant execute on dbo.[rep_TEST] to groupA


выполняю успешно от своего имени (все права на сервере + владелец базы + вхожу в группу groupA).
создаю скл-ного пользователя. даю ему права на группу groupA. при выполнении процедуры происходит ошибка:

The SELECT permission was denied on the object 'view', database 'db', schema 'dbo'


в качестве теста исправляю процедуру следующим образом:
CREATE PROCEDURE dbo.[rep_TEST] 
  (
    @cnt  int = 1
  )
AS
  set nocount on

  declare @nsql nvarchar(1000)
  
  select top 1 * from dbo.view v
  /*set @nsql = 'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
  exec sp_executesql @nsql*/

GO
grant execute on dbo.[rep_TEST] to groupA


процедура выполняется успешно для обоих пользователей.
думаю...
вспоминаю, что забыл прописать execute as owner. исправляю процедуру.
CREATE PROCEDURE dbo.[rep_TEST] 
  (
    @cnt  int = 1
  )
  with execute as owner 
AS
  set nocount on

  declare @nsql nvarchar(1000)
  
  set @nsql = 'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
  
  exec sp_executesql @nsql

GO
grant execute on dbo.[rep_TEST] to groupA


процедура выполняется успешно из-под обоих пользователей.
начинаю курить мануал:
как говорит мсдн ([url=]https://msdn.microsoft.com/ru-ru/library/ms188354(v=sql.120).aspx[/url]) -
Аргумент CALLER является значением по умолчанию для всех модулей, кроме очередей, и работает так же, как и в SQL Server 2005.
Значит у меня в первый раз процедура выполнялась как execute as caller.
Тогда почему статический код выполнился в режиме execute as caller, а динамический нет? Если при выполнении динамики права нужны вызывающему пользователю, а не владельцу, то почему в режиме caller для статики хватило прав?
5 ноя 15, 14:49    [18373830]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
вспоминаю, что забыл прописать execute as owner

Для чего ?

Tester666
Тогда почему статический код выполнился в режиме execute as caller, а динамический нет?

By design

Tester666
Если при выполнении динамики права нужны вызывающему пользователю, а не владельцу, то почему в режиме caller для статики хватило прав?

Прав хватило потому, что они были назначены/получены.
5 ноя 15, 14:53    [18373860]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Tester666,

'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
select top (@cnt) * from dbo.view
5 ноя 15, 15:06    [18373995]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
o-o
Guest
Tester666
Тогда почему статический код выполнился в режиме execute as caller, а динамический нет? Если при выполнении динамики права нужны вызывающему пользователю, а не владельцу, то почему в режиме caller для статики хватило прав?

не то вы говорите.
на все execute as caller распространяется, на динамику внутри процедуры тоже.
а вот что не распространяется, так это ownership chaining.
т.к. у динамики овнера нет, права на объект из динамики проверяются.
и ваш caller обломался, а owner проканался, т.к. у него действительно есть права на вьюху.
create proc dbo.usp_exec_as_caller
as
 select user;
 exec('select user;');
 go
 
 create proc dbo.usp_exec_as_owner
 with execute as owner 
as
 select user;
 exec('select user;');
 go
 
create user us without login;
go 

grant execute to us;
go

execute as user = 'us';
exec dbo.usp_exec_as_caller;
---
us
us
exec dbo.usp_exec_as_owner;
---
dbo
dbo
revert;
5 ноя 15, 15:08    [18374015]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Tester666
Member

Откуда:
Сообщений: 179
Владислав Колосов,
да, можно и так, спасибо.
5 ноя 15, 15:50    [18374396]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Tester666
Member

Откуда:
Сообщений: 179
o-o,

пробовал выполнить процедуру так:

CREATE PROCEDURE dbo.[rep_TEST] 
  (
    @cnt  int = 1
  )
  execute as caller
AS
  set nocount on

  declare @nsql nvarchar(1000)
  select top * from dbo.view v
  /*set @nsql = 'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
    exec sp_executesql @nsql*/

GO
grant execute on dbo.[rep_TEST] to groupA


выполнилась успешно под обоими пользователями

теперь вот так:

CREATE PROCEDURE dbo.[rep_TEST] 
  (
    @cnt  int = 1
  )
  execute as caller
AS
  set nocount on

  declare @nsql nvarchar(1000)
  set @nsql = 'select top ' + isnull(cast(@cnt as varchar(255)),0) + ' * from dbo.view v'
  exec sp_executesql @nsql

GO
grant execute on dbo.[rep_TEST] to groupA


под скл-ным пользователем не работает

вот мне и непонятно если контекст один - почему такие разные результаты.
5 ноя 15, 15:55    [18374430]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Tester666
Member

Откуда:
Сообщений: 179
наверное я чего-то действительно не понимаю
5 ноя 15, 15:55    [18374435]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Tester666
вот мне и непонятно если контекст один - почему такие разные результаты.

Если в модуле есть обращения к объектам, владелец которых совпадает с владельцем модуля, разрешения для таких объектов не проверяются. Это называется "цепочки владения".
В вашей первой процедуре именно благодоря цепочкам владения разрешения на dbo.view не проверяются.
Во второй динамический SQL выполняется вне модуля. Соответственно никаких цепочек нет и разрешения проверяются.
5 ноя 15, 16:05    [18374484]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
o-o
Guest
Tester666,
поехали снова.
изучаем внимательно
Ownership Chains
BOL
When an object is accessed through a chain, SQL Server first compares the owner of the object to the owner of the calling object.
This is the previous link in the chain. If both objects have the same owner, permissions on the referenced object are not evaluated.

в вашем примере овнер процедуры и овнер вью совпадают, это dbo.
выдав права на процедуру юзеру А, вы неявно разрешили ему
лезть во все объекты, к-ые цитирует процедура, где тот же самый овнер dbo.
права на них просто не проверяются.
но: цепочка разрывается в случае динамического sql.
и права на вьюху проверяют.
у юзера А прав на нее нет -- arrivederci.

теперь процедура исполняется от имени овнера.
в динамике снова рвется цепочка и права на вью проверяют.
у овнера есть права, процедура выполняется от его имени, поэтому А может читать из вьюхи.
5 ноя 15, 16:07    [18374501]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру  [new]
Tester666
Member

Откуда:
Сообщений: 179
Спасибо всем за разъяснения!
6 ноя 15, 09:05    [18376525]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить