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 в хранимых процедурах и функциях, ему можно передать несколько зарезервированных значений, которые подставляются вместо имени пользователя:
EXECUTE AS CALLER — все команды в хранимой процедуре или функции будут выполнены с правами текущего пользователя (при этом неважно, кто является владельцем этой хранимой процедуры или функции);
EXECUTE AS SELF — все команды в хранимой процедуре или функции будут выполняться от имени пользователя, который создает или изменяет данную процедуру или функцию. Это значение используется в редких случаях, когда клиентскому приложению требуется создавать хранимые процедуры или функции и запускать их от имени разных пользователей;
EXECUTE AS OWNER — все команды хранимой процедуры или функции будут выполняться от имени ее текущего владельца. Это значение тоже используется редко: обычно только в тех ситуациях, когда владелец хранимой процедуры или функции может часто меняться.
Выражение EXECUTE AS можно использовать не только для изменения контекста выполнения на уровне базы данных, но и на уровне сервера (т. е. логинов). Для этого ключевое слово USER меняется на LOGIN, например:
Достарыңызбен бөлісу: |