Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Na SQL Serveru můžete definovat kontext spuštění následujících uživatelsky definovaných modulů: funkce (s výjimkou vložených funkcí hodnot tabulek), procedur, front a triggerů.
Zadáním kontextu, ve kterém se modul spouští, můžete určit, který uživatelský účet databázový stroj používá k ověření oprávnění k objektům, na které modul odkazuje. To poskytuje větší flexibilitu a kontrolu nad správou oprávnění napříč řetězem objektů, který existuje mezi uživatelem definovanými moduly a objekty, na které tyto moduly odkazují. Oprávnění musí být udělena pouze uživatelům v samotném modulu, aniž by jim museli udělit explicitní oprávnění k odkazovaným objektům. Pouze uživatel, který modul běží, musí mít oprávnění k objektům, ke kterým modul přistupuje.
Syntaxe
Tato část popisuje syntaxi SQL Serveru pro EXECUTE AS.
Funkce (s výjimkou vložených funkcí hodnot tabulek), uložených procedur a triggerů DML:
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }
Triggery DDL s oborem databáze:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }
Triggery DDL s oborem serveru a přihlašovacími triggery:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }
Fronty:
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }
Arguments
VOLAJÍCÍ
Určuje příkazy uvnitř modulu, které se spouští v kontextu volajícího modulu. Uživatel, který modul spouští, musí mít odpovídající oprávnění nejen pro samotný modul, ale také pro všechny databázové objekty, na které modul odkazuje.
CALLER je výchozí hodnota pro všechny moduly kromě front a je stejná jako chování SQL Serveru 2005 (9.x).
CALLER nelze zadat v CREATE QUEUE příkazu ani ALTER QUEUE v příkazu.
SELF
EXECUTE AS SELF je ekvivalentní EXECUTE AS <user_name>, kde zadaný uživatel je osoba, která vytváří nebo mění modul. Skutečné ID uživatele osoby, která vytváří nebo upravuje moduly, je uloženo ve execute_as_principal_id sloupci v sys.sql_modules zobrazení katalogu.sys.service_queues
SELF je výchozí hodnota pro fronty.
Poznámka:
Pokud chcete změnit ID execute_as_principal_id uživatele sloupce v sys.service_queues zobrazení katalogu, musíte explicitně zadat EXECUTE AS nastavení v ALTER QUEUE příkazu.
VLASTNÍK
Určuje, že příkazy uvnitř modulu se spouštějí v kontextu aktuálního vlastníka modulu. Pokud modul nemá zadaného vlastníka, použije se vlastník schématu modulu.
OWNER nelze zadat pro triggery DDL ani přihlášení.
Důležité
OWNER musí být namapovat na jeden účet a nemůže být rolí nebo skupina.
User_name
Určuje příkazy uvnitř modulu spouštěné v kontextu uživatele zadaného v user_name. Oprávnění pro všechny objekty v modulu jsou ověřena proti user_name. user_name nelze zadat pro triggery DDL s oborem serveru nebo triggery přihlášení. Místo toho použijte login_name .
user_name musí existovat v aktuální databázi a musí být jedním účtem.
user_name nemůže být skupina, role, certifikát, klíč ani předdefinovaný účet, například NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicenebo NT AUTHORITY\LocalSystem.
ID uživatele kontextu spuštění je uloženo v metadatech a lze ho execute_as_principal_id zobrazit ve sloupci v sys.sql_modules zobrazení katalogu.sys.assembly_modules
"login_name"
Určuje příkazy uvnitř modulu spouštěné v kontextu přihlášení SQL Serveru zadaného v login_name. Oprávnění pro všechny objekty v rámci modulu jsou ověřena v login_name. login_name lze zadat pouze pro triggery DDL s oborem serveru nebo triggery přihlášení.
login_name nemůže být skupina, role, certifikát, klíč nebo předdefinovaný účet, například NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicenebo NT AUTHORITY\LocalSystem.
Poznámky
Způsob vyhodnocení oprávnění k objektům odkazovaným v modulu závisí na řetězu vlastnictví, který existuje mezi voláními objektů a odkazovanými objekty. V dřívějších verzích SQL Serveru bylo řetězení vlastnictví jedinou dostupnou metodou, aby se zabránilo tomu, že volajícímu uživateli udělíte přístup ke všem odkazovaným objektům.
Řetězení vlastnictví má následující omezení:
- Platí pouze pro příkazy DML:
SELECT,INSERT,UPDATEaDELETE. - Vlastníci volání a volané objekty musí být stejné.
- Nevztahuje se na dynamické dotazy v modulu.
Bez ohledu na kontext spuštění zadaný v modulu se vždy použijí následující akce:
Po spuštění modulu databázový stroj nejprve ověří, že uživatel, který modul spouští, má
EXECUTEk modulu oprávnění.Pravidla řetězení vlastnictví se budou dál používat. To znamená, že pokud jsou vlastníci volajících a volaných objektů stejné, nejsou u podkladových objektů kontrolována žádná oprávnění.
Když uživatel spustí modul, který byl zadán ke spuštění v jiném kontextu než CALLER, je zaškrtnuté oprávnění uživatele ke spuštění modulu, ale další kontroly oprávnění pro objekty, ke kterým modul přistupuje, se provádějí s uživatelským účtem zadaným v EXECUTE AS klauzuli. Uživatel, který modul spouští, se v podstatě zosobní zadaného uživatele.
Kontext zadaný v EXECUTE AS klauzuli modulu je platný pouze po dobu trvání provádění modulu. Kontext se po dokončení provádění modulu vrátí volajícímu.
Zadání uživatele nebo přihlašovacího jména
Přihlašovací jméno uživatele databáze nebo serveru zadané v EXECUTE AS klauzuli modulu nelze vynechat, dokud se modul nezmění tak, aby se spustil v jiném kontextu.
Uživatel nebo přihlašovací jméno zadané v EXECUTE AS klauzuli musí existovat jako objekt zabezpečení nebo sys.database_principalssys.server_principalsjinak operace vytvoření nebo změny modulu selže. Uživatel, který vytvoří nebo změní modul, musí mít navíc oprávnění IMPERSONATE k objektu zabezpečení.
Pokud má uživatel implicitní přístup k databázi nebo instanci SQL Serveru prostřednictvím členství ve skupině Systému Windows, uživatel zadaný v EXECUTE AS klauzuli se implicitně vytvoří při vytvoření modulu v případě, že existuje jeden z následujících požadavků:
- Zadaný uživatel nebo přihlášení je členem pevné role serveru správce systému .
- Uživatel, který vytváří modul, má oprávnění k vytváření objektů zabezpečení.
Pokud nejsou splněny žádné z těchto požadavků, operace vytvoření modulu selže.
Důležité
Pokud je služba SQL Server (MSSQLSERVER) spuštěná jako místní účet (místní služba nebo místní uživatelský účet), nebude mít oprávnění získat členství ve skupinách účtu domény systému Windows, který je zadán v EXECUTE AS klauzuli. To způsobí selhání spuštění modulu.
Předpokládejme například následující podmínky:
CompanyDomain\SQLUsersskupina má přístup kSalesdatabázi.CompanyDomain\SqlUser1je členemSQLUsersdatabáze, a proto má přístup kSalesdatabázi.Uživatel, který vytváří nebo mění modul, má oprávnění k vytváření objektů zabezpečení.
Při spuštění CREATE PROCEDURE následujícího CompanyDomain\SqlUser1 příkazu se implicitně vytvoří jako objekt databáze v Sales databázi.
USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT USER_NAME();
GO
Použití samostatného příkazu EXECUTE AS CALLER
Pomocí samostatného EXECUTE AS CALLER příkazu uvnitř modulu nastavte kontext spuštění na volajícího modulu.
Předpokládejme, že následující uložená procedura je volána .SqlUser2
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'SqlUser1'
AS
SELECT USER_NAME(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT USER_NAME(); -- Shows execution context is set to SqlUser2, the caller of the module.
REVERT;
SELECT USER_NAME(); -- Shows execution context is set to SqlUser1.
GO
Použití příkazu EXECUTE AS k definování vlastních sad oprávnění
Zadání kontextu spuštění modulu může být užitečné, když chcete definovat vlastní sady oprávnění. Například některé akce, například TRUNCATE TABLE nemají udělená oprávnění.
TRUNCATE TABLE Zahrnutím příkazu do modulu a určením, že se tento modul spustí jako uživatel s oprávněními ke změně tabulky, můžete rozšířit oprávnění pro zkrácení tabulky na uživatele, kterému udělíte EXECUTE oprávnění k modulu.
Pokud chcete zobrazit definici modulu se zadaným kontextem spuštění, použijte zobrazení katalogu sys.sql_modules .
Osvědčený postup
Zadejte přihlašovací jméno nebo uživatele s nejnižšími oprávněními potřebnými k provádění operací definovaných v modulu. Například nezadávejte účet vlastníka databáze, pokud tato oprávnění nejsou nutná.
Povolení
Chcete-li spustit modul zadaný EXECUTE ASpomocí , volající musí mít EXECUTE oprávnění k modulu.
Pokud chcete spustit modul CLR určený pro přístup k prostředkům EXECUTE AS v jiné databázi nebo serveru, musí cílová databáze nebo server důvěřovat ověřovacímu objektu databáze, ze které modul pochází (zdrojová databáze).
Pokud chcete zadat klauzuli EXECUTE AS při vytváření nebo úpravě modulu, musíte mít IMPERSONATE oprávnění k zadanému objektu zabezpečení a také oprávnění k vytvoření modulu. Vždy se můžete zosobnit sami. Pokud není zadán kontext spuštění nebo EXECUTE AS CALLER je zadán, IMPERSONATE oprávnění nejsou vyžadována.
Pokud chcete zadat login_name nebo user_name , které mají implicitní přístup k databázi prostřednictvím členství ve skupině Windows, musíte mít CONTROL oprávnění k databázi.
Examples
Následující příklad vytváří uloženou proceduru v databázi AdventureWorks2025 a přiřazuje kontext OWNERvykonání .
CREATE PROCEDURE HumanResources.uspEmployeesInDepartment
@DeptValue INT
WITH EXECUTE AS OWNER
AS
SET NOCOUNT ON;
SELECT e.BusinessEntityID,
c.LastName,
c.FirstName,
e.JobTitle
FROM Person.Person AS c
INNER JOIN HumanResources.Employee AS e
ON c.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE edh.DepartmentID = @DeptValue
ORDER BY c.LastName, c.FirstName;
GO
-- Execute the stored procedure by specifying department 5.
EXECUTE HumanResources.uspEmployeesInDepartment 5;
GO