Биты и байты.

Биты и байты.

среда, 15 июля 2015 г.

Основные сведения о переключении контекста

Как переключать контекст

Контекст выполнения определяет под каким пользователем или именем входа выполняется текущая команда. Детали см. в разделе Основные сведения о контексте выполнения.

Явное переключение контекста


Выполняется через инструкцию EXECUTE AS LOGIN. Олицетворение остается в силе до тех пор, пока не произойдет одно из следующих событий:
Сеанс удаляется.
Контекст переключен на другое имя входа или на другого пользователя.
Контекст восстановлен до контекста предыдущего выполнения.

Для возврата к предыдущему контексту используется инструкция REVERT. Вызывающий инструкцию REVERT должен находиться в базе данных, где произошло олицетворение.

Пример

В следующем примере Питер Коннели, сетевой администратор компании Adventure Works Cycles, хочет создать учетную запись имени входа SQL Server для нового сотрудника Цзинхао Люхаса. У имени входа Питера в SQL Server нет необходимых для создания имен входа SQL Server разрешений уровня сервера, но Питер обладает разрешением IMPERSONATE в adventure-works\dan1, имени входа SQL Server с нужным разрешением уровня сервера. Когда Питер подключается к экземпляру SQL Server, контекст выполнения сеанса образуется из его имени входа в SQL Server. Чтобы создать имя входа SQL Server, Питер временно принимает контекст выполнения adventure-works\dan1. Затем он создает имя входа. Наконец, он освобождает присвоенные разрешения.
-- Switch execution context to the adventure-works\dan1 login account.
EXECUTE AS LOGIN = 'adventure-works\dan1';
-- Create the new login account.
CREATE LOGIN Jinghao1 WITH PASSWORD = '3KHJ6dhx(0xVYsdf';
-- Revert to the previous execution context.
REVERT;


Для переключения контекста выполнения на уровне базы данных используйте инструкцию EXECUTE AS USER = 'user_name'. 

Пример

В следующем примере, Франсуа Аженста, администратор базы данных компании Adventure Works Cycles, хочет выполнить инструкцию DBCC CHECKDB в базе данных AdventureWorksDW, но не имеет для этого разрешений на уровне базы данных. Однако он обладает разрешениями IMPERSONATE пользователя dan1, учетной записи с нужным разрешением.
Когда Франсуа подключается к базе данных AdventureWorksDW, контекст выполнения сопоставляется с его маркером безопасности пользователя. Разрешения на выполнение инструкций проверяются у первичных и вторичных участников в его маркере пользователя. Из-за того, что он не обладает разрешениями, необходимыми для выполнения инструкции DBCC CHECKDB, он выполняет следующие инструкции.
-- EXECUTE AS USER = 'dan1';
-- Create a table in dan1's default schema
CREATE TABLE t_NewTable( data nvarchar(100) );
go
-- Revert to the previous execution context.
REVERT
go;

Неявное переключение контекста

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


Пример

В следующем примере Мэри является владельцем таблицы MyTable. Она хочет, чтобы пользователь Скотт имел возможность усекать таблицы, но у Скотта нет прямого разрешения на работу с таблицами. Поэтому она создает хранимую процедуруdbo.usp_TruncateMyTable и предоставляет Скотту разрешение EXECUTE для этой процедуры. Когда Скотт выполняет эту хранимую процедуру, компонент Database Engine проверяет разрешения на усечение таблицы, как если бы хранимую процедуру выполняла Мэри. Так как она является владельцем таблицы, то инструкция выполнится даже в том случае, если Скотт не обладает прямыми разрешениями на работу с таблицами.
CREATE PROCEDURE dbo.usp_TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

About