Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Microsoft SQL Server 2005 для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

5.5. Изменение контекста выполнения. Выражение EXECUTE AS

Смена пользователя в ходе выполнения скрипта SQL Server 2005, EXECUTE AS, REVERT

Новая возможность SQL Server 2005 — изменение контекста выполнения команд Transact-SQL. Например, вы подключились от имени пользователя, у которого нет прав на определенную таблицу. Но в то же время вы обладаете правом выступать от имени другого пользователя, у которого права на эту таблицу есть (право действовать от имени другого пользователя называется IMPERSONATE). Вместо того чтобы разрывать соединение с SQL Server и входить заново от имени второго пользователя, вы можете просто "превратиться" во второго пользователя при помощи выражения EXECUTE AS и выполнить необходимые запросы к таблице от имени этого пользователя и с его правами, а потом, при желании, вернуться обратно.

В принципе, возможность менять контекст выполнения была и в предыдущих версиях SQL Server. Она представлялась командой SETUSER (для обратной совместимости эта команда сохранена и в SQL Server 2005). Однако возможностей у EXECUTE AS намного больше:

q      команда SETUSER позволяла менять контекст выполнения только пользователям с правами системного администратора (на уровне сервера) или dbo (на уровне базы данных). Поскольку прав у этих пользователей и так всегда достаточно, то обычно команда SETUSER применялась только для проверки, как та или иная команда будет выполняться от имени определенного пользователя. Выражение EXECUTE AS могут использовать любые пользователи, поэтому основное назначение этого выражения — "подключение" пользователю дополнительных прав на время выполнения определенных команд;

q      выражение EXECUTE AS, в отличие от команды SETUSER, позволяет возвращаться "обратно" — к исходной учетной записи, которая использовалась до смены контекста выполнения. Для этого используется команда REVERT. При этом с помощью EXECUTE AS вы вполне можете поменять контекст выполнения несколько раз. Каждая выполненная команда REVERT вернет контекст выполнения на один "уровень" назад.

Работа с выражением EXECUTE AS очень проста. Предположим, что у вас есть пользователь базы данных User1, у которого нет прав на таблицу Table2, и пользователь User2, у которого такие права есть. До начала применения команды EXECUTE AS необходимо предоставить пользователю User1 право IMPERSONATE на объект пользователя User2, чтобы он получил возможность выполнять команды от имени этого пользователя. На графическом экране это можно сделать так:

q      откройте свойства пользователя User1 в Management Studio и перейдите на вкладку Securables;

q      нажмите кнопку Add под списком Securables, в открывшемся окне установите переключатель в положение All objects of the types (Все объекты типа) и нажмите кнопку OK;

q      в списке типов объектов выберите Users и нажмите кнопку OK;

q      в загруженном списке пользователей выберите пользователя User2 и установите для него флажок в столбце Grant напротив разрешения IMPERSONATE (рис. 5.5).

Рис. 5.5. Предоставление права IMPERSONATE

Соответствующая команда Transact-SQL может выглядеть так:

GRANT IMPERSONATE ON USER::User2 TO User1;

После этого можно использовать возможности выражения EXECUTE AS, например, так:

-- Переключаемся в контекст выполнения User2

EXECUTE AS USER = 'User2';

-- Обращаемся к таблице Table2

SELECT * FROM dbo.Table2;

-- Возвращаемся в контекст выполнения User1

REVERT;

Чаще всего выражение EXECUTE AS используется в определениях программных модулей Transact-SQL (процедур или функций). Это позволяет менять контекст выполнения только на время работы данной хранимой процедуры или функции, например:

CREATE PROCEDURE SelectFromTable2

   WITH EXECUTE AS 'User2'

   AS SELECT * FROM dbo.Table2;

Если у пользователя есть право EXECUTE на хранимую процедуру SelectFromTable2, он может выполнять ее от имени пользователя User2.

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

Если вы используете выражение EXECUTE AS в хранимых процедурах и функциях, ему можно передать несколько зарезервированных значений, которые подставляются вместо имени пользователя:

q      EXECUTE AS CALLER — все команды в хранимой процедуре или функции будут выполнены с правами текущего пользователя (при этом неважно, кто является владельцем этой хранимой процедуры или функции);

q      EXECUTE AS SELF — все команды в хранимой процедуре или функции будут выполняться от имени пользователя, который создает или изменяет данную процедуру или функцию. Это значение используется в редких случаях, когда клиентскому приложению требуется создавать хранимые процедуры или функции и запускать их от имени разных пользователей;

q      EXECUTE AS OWNER — все команды хранимой процедуры или функции будут выполняться от имени ее текущего владельца. Это значение тоже используется редко: обычно только в тех ситуациях, когда владелец хранимой процедуры или функции может часто меняться.

Выражение EXECUTE AS можно использовать не только для изменения контекста выполнения на уровне базы данных, но и на уровне сервера (т. е. логинов). Для этого ключевое слово USER меняется на LOGIN, например:

EXECUTE AS LOGIN = 'Login2';

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2016, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru