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

Откуда:
Сообщений: 333
Добрый вечер!

Данные SQL Server'а:
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

Имеется следующая хранимка для определения пользователей в Windows-группах (два логина в виде Windows-групп).
alter procedure dbo.GetUsersList
with execute as owner
as
begin

set nocount on;
declare @groupname varchar(100);

declare @UsersInfo table
(
	Account_Name varchar(2500),
	[Type] varchar(10),
	Privilege varchar(10),
	Mapped_Login_Name varchar(60),
	Group_Name varchar(100)	
);

declare Get_Groups cursor
for select name
	from master..syslogins
	where isntgroup = 1 and status >= 9;

open Get_Groups;
fetch next from Get_Groups into @groupname;

while (@@fetch_status <> -1)
begin

	if (@@fetch_status = -2)
		begin
			fetch next from Get_Groups into @groupname;
			continue;
		end;

	insert into @UsersInfo
	exec master..xp_logininfo @Groupname, 'members'
	fetch next from Get_groups into @groupname

end;

close Get_Groups;
deallocate Get_Groups;

select *
from @UsersInfo;

end;


Так вот какая проблема. Если выделить исполняемый текст в самой процедуре и запустить, то всё ОК - появляется таблица с названиями групп и пользователей, но когда запускаю так:
execute dbo.GetUsersList;

то появляется пустая таблица с корректными заголовками. Долго не мог понять, почему происходит. И тут ко мне пришла мысль убрать строку "with execute as owner" - и заработало! Подскажите, пожалуйста, почему так происходит? Спасибо.
21 окт 14, 23:44    [16740504]     Ответить | Цитировать Сообщить модератору
 Re: SP не работает с "EXECUTE AS OWNER"  [new]
o-o
Guest
вы своим execute as owner сделали такое (пробуйте):

execute as user = 'dbo'
select name
from master..syslogins
where isntgroup = 1 and status >= 9;
revert; 


dbo -- это юзер в базе, а чтобы хоть что-то видеть в логинах,
надо иметь права уровня сервера.

иными словами, пока вы не написали execute as owner,
при исполнении процедуры использовались ваши права как логина,
как только execute as owner, так сразу этих прав нет.

как это увидеть.
снова выполните от имени dbo и от своего:
-- excute as login:
select *
from sys.login_token;

-- excute as dbo:
execute as user = 'dbo'
select *
from sys.login_token;
revert;


песочница откроется, если база будет TRUSTWORTHY.
это можете проделать для эксперимента:
alter database <...> set trustworthy on

запустите теперь процедуру, сохраненную с execute as owner, и убедитесь, что так сработает.
можно еще в нее добавить select * from sys.login_token, чтобы увидеть, как вдруг права добавились.

потом верните обратно TRUSTWORTHY OFF
alter database <...> set trustworthy off

т.к. TRUSTWORTHY ON открывает дырищу в безопасности.

задача решается через сертификат, а выше в той же теме -- подробности
Execute AS
22 окт 14, 01:42    [16740831]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить