0

Я не совсем понимаю разницу между различными целями EXECUTE AS в SQL Server: CALLER, SELF и OWNER, особенно между двумя последними.Разница EXECUTE AS цели

Насколько я понимаю, CALLER - это тот, кто выполняет/вызывается процедура.

SELF является the specified user is the person creating or altering the module

ВЛАДЕЛЕЦ the current owner of the module

Не могли бы вы объяснить и дать некоторые пример, который the person creating/modifying и the owner of the module. Является ли «модуль» здесь хранимой процедурой/функцией или сеансом или базой данных? Включение примера с пользователем SELF будет отличным.

ответ

1

Будучи поставленным очень простым, SELF олицетворяет вас как пользователя базы данных, который фактически выполнил create/alter procedure в последний раз. Это не всегда должно быть владельцем схемы, как вы можете себе представить, это может быть любой человек с разрешениями, достаточными для создания/модификации данных объектов.

Режим OWNER олицетворяет вас как владелец схемы, к которой принадлежит процедура/функция.

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

use master; 
go 
if db_id('TestDB') is not null 
    drop database TestDB; 
go 
create database TestDB; 
go 
use TestDB; 
go 
-- Just for the sake of example, so that everyone can create procs 
grant create procedure to public; 
go 
-- Schema owner 
create user [SomeUser] without login; 
go 
create schema [s1] authorization [SomeUser]; 
go 
-- An ordinary user 
create user [AnotherUser] without login; 
go 
grant execute on schema::s1 to AnotherUser as [SomeUser]; 
go 
-- Database administrator 
create user [DBA] without login; 
go 
alter role [db_owner] add member [DBA]; 
go 

-- Although it's SomeUser that owns the schema, DBA creates objects in it 
execute as user = 'DBA'; 
go 
create procedure s1.SpCaller 
as 
select user_name() as [s1_caller]; 
return; 
go 
create procedure s1.SpSelf 
with execute as self as 
select user_name() as [s1_self]; 
return; 
go 
create procedure s1.SpOwner 
with execute as owner as 
select user_name() as [s1_owner]; 
return; 
go 
revert; 
go 

-- You can play with actual impersonation and look at results 
execute as user = 'AnotherUser'; 
go 
exec s1.SpCaller; 
go 
exec s1.SpSelf; 
go 
exec s1.SpOwner; 
go 
revert; 
go 

 Смежные вопросы

  • Нет связанных вопросов^_^