Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Az SQL Serverben a következő, felhasználó által definiált modulok végrehajtási környezetét határozhatja meg: függvények (a beágyazott táblaértékű függvények kivételével), eljárások, üzenetsorok és eseményindítók.
A modul végrehajtásának környezetének megadásával szabályozhatja, hogy az adatbázismotor melyik felhasználói fiókot használja a modul által hivatkozott objektumok engedélyeinek érvényesítéséhez. Ez további rugalmasságot és vezérlést biztosít a felhasználó által definiált modulok és a modulok által hivatkozott objektumok között létező objektumlánc engedélyeinek kezelése során. Az engedélyeket csak a modul felhasználói számára lehet megadni, anélkül, hogy explicit engedélyeket kellene adni nekik a hivatkozott objektumokhoz. Csak a modul által futtatott felhasználónak kell engedélyekkel rendelkeznie a modul által elért objektumokhoz.
Transact-SQL szintaxis konvenciók
Szemantika
Ez a szakasz a következő SQL Server-szintaxist EXECUTE ASismerteti: .
Függvények (kivéve a beágyazott táblaértékű függvényeket), a tárolt eljárásokat és a DML-eseményindítókat:
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }
DDL-eseményindítók adatbázis-hatókörrel:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }
A DDL-eseményindítók kiszolgálói hatókörrel és bejelentkezési eseményindítókkal:
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }
Várólisták:
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }
Arguments
HÍVÓ
A modulon belüli utasításokat a modul hívójának kontextusában hajtja végre. A modult végrehajtó felhasználónak nem csak magára a modulra, hanem a modul által hivatkozott adatbázis-objektumokra is megfelelő engedélyekkel kell rendelkeznie.
CALLER az üzenetsorok kivételével az összes modul alapértelmezett értéke, és megegyezik az SQL Server 2005 (9.x) viselkedésével.
CALLER nem adható meg utasításban CREATE QUEUE vagy ALTER QUEUE utasításban.
SELF
EXECUTE AS SELF egyenértékű azzal EXECUTE AS <user_name>, ahol a megadott felhasználó a modult létrehozó vagy módosító személy. A modulokat létrehozó vagy módosító személy tényleges felhasználói azonosítóját a rendszer a katalógus vagy execute_as_principal_id a sys.sql_modulessys.service_queues katalógus nézet oszlopában tárolja.
SELF az üzenetsorok alapértelmezett értéke.
Megjegyzés:
Ha módosítani szeretné az execute_as_principal_id oszlop felhasználói azonosítóját a sys.service_queues katalógusnézetben, explicit módon meg kell adnia a EXECUTE AS beállítást az ALTER QUEUE utasításban.
TULAJDONOS
Megadja, hogy a modulon belüli utasítások a modul aktuális tulajdonosának kontextusában futnak- e. Ha a modulnak nincs megadott tulajdonosa, a rendszer a modul sémájának tulajdonosát használja.
OWNER DDL-hez vagy bejelentkezési eseményindítókhoz nem adható meg.
Fontos
OWNER egy adott fiókhoz kell megfeleltetnie, és nem lehet szerepkör vagy csoport.
"user_name"
Megadja a modulon belüli utasításokat, amelyeket a user_name megadott felhasználó kontextusában hajtanak végre. A modulon belüli objektumok engedélyeit a rendszer ellenőrzi user_name. user_name nem adható meg a kiszolgáló hatókörével vagy bejelentkezési eseményindítókkal rendelkező DDL-eseményindítókhoz. Használja inkább a login_name .
user_name az aktuális adatbázisban kell lennie, és egyetlen fióknak kell lennie.
user_name nem lehet csoport, szerepkör, tanúsítvány, kulcs vagy beépített fiók, például NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicevagy NT AUTHORITY\LocalSystem.
A végrehajtási környezet felhasználói azonosítója metaadatokban van tárolva, és megtekinthető a katalógus vagy execute_as_principal_id a sys.sql_modules katalógus nézetben lévő sys.assembly_modules oszlopban.
"login_name"
Megadja a modulon belüli utasításokat, amelyeket a login_name megadott SQL Server-bejelentkezés kontextusában hajtanak végre. A modulon belüli objektumok engedélyeit a rendszer ellenőrzi login_name. login_name csak a kiszolgáló hatókörével vagy bejelentkezési eseményindítókkal rendelkező DDL-eseményindítókhoz adható meg.
login_name nem lehet csoport, szerepkör, tanúsítvány, kulcs vagy beépített fiók, például NT AUTHORITY\LocalService, NT AUTHORITY\NetworkServicevagy NT AUTHORITY\LocalSystem.
Megjegyzések
Az adatbázismotor a modulban hivatkozott objektumok engedélyeinek kiértékelése az objektumok meghívása és a hivatkozott objektumok közötti tulajdonjogi lánctól függ. Az SQL Server korábbi verzióiban a tulajdonosi láncolás volt az egyetlen elérhető módszer, amely elkerülte, hogy a hívó felhasználónak hozzáférést kell adnia az összes hivatkozott objektumhoz.
A tulajdonjog-láncolásra a következő korlátozások vonatkoznak:
- Csak a DML-utasításokra vonatkozik:
SELECT,INSERT,UPDATEésDELETE. - A hívás és a hívott objektumok tulajdonosainak azonosnak kell lenniük.
- A modulon belüli dinamikus lekérdezésekre nem vonatkozik.
A modulban megadott végrehajtási környezettől függetlenül a következő műveletek mindig érvényesek:
A modul végrehajtásakor az adatbázismotor először ellenőrzi, hogy a modult végrehajtó felhasználó rendelkezik-e
EXECUTEengedéllyel a modulhoz.A tulajdonjog-láncolásra vonatkozó szabályok továbbra is érvényesek. Ez azt jelenti, hogy ha a hívás és a hívott objektumok tulajdonosai azonosak, a rendszer nem ellenőrzi az engedélyeket az alapul szolgáló objektumokon.
Ha egy felhasználó olyan modult hajt végre, amely a megadotttól eltérő CALLERkörnyezetben fut, a rendszer ellenőrzi a felhasználónak a modul végrehajtására vonatkozó engedélyét, de a modul által elért objektumok további engedélyeit a záradékban EXECUTE AS megadott felhasználói fiókon hajtja végre. A modult végrehajtó felhasználó valójában megszemélyesíti a megadott felhasználót.
A modul záradékában EXECUTE AS megadott környezet csak a modul végrehajtásának időtartamára érvényes. A környezet visszaáll a hívóra, amikor a modul végrehajtása befejeződött.
Felhasználó vagy bejelentkezési név megadása
A modul záradékában EXECUTE AS megadott adatbázis-felhasználó vagy kiszolgálói bejelentkezés nem törölhető, amíg a modult nem módosítják egy másik környezetben való végrehajtásra.
A záradékban EXECUTE AS megadott felhasználónévnek vagy bejelentkezési névnek egyszerűként sys.database_principalssys.server_principalskell léteznie, vagy ellenkező esetben a létrehozási vagy módosítási modulművelet meghiúsul. Emellett a modult létrehozó vagy módosító felhasználónak impERSONATE engedélyekkel kell rendelkeznie az egyszerű felhasználóhoz.
Ha a felhasználó implicit hozzáféréssel rendelkezik az SQL Server adatbázisához vagy példányához Windows-csoporttagságon keresztül, a EXECUTE AS záradékban megadott felhasználó implicit módon jön létre a modul létrehozásakor, amikor a következő követelmények valamelyike létezik:
- A megadott felhasználó vagy bejelentkezés a sysadmin rögzített kiszolgálói szerepkör tagja.
- A modult létrehozó felhasználó rendelkezik engedéllyel az egyszerű felhasználók létrehozására.
Ha egyik követelmény sem teljesül, a modul létrehozása nem sikerül.
Fontos
Ha az SQL Server (MSSQLSERVER) szolgáltatás helyi fiókként (helyi szolgáltatásként vagy helyi felhasználói fiókként) fut, akkor nem lesz jogosultsága a záradékban EXECUTE AS megadott Windows-tartományi fiók csoporttagságainak beszerzésére. Ez a modul végrehajtásának meghiúsulását okozza.
Tegyük fel például, hogy a következő feltételek teljesülnek:
CompanyDomain\SQLUserscsoport hozzáféréssel rendelkezik azSalesadatbázishoz.CompanyDomain\SqlUser1SQLUserstagja az adatbázisnak, és így hozzáféréssel rendelkezik azSalesadatbázishoz.A modult létrehozó vagy módosító felhasználó rendelkezik jogosultságokkal az egyszerű felhasználók létrehozásához.
A következő CREATE PROCEDURE utasítás futtatásakor a rendszer implicit módon hozza létre az CompanyDomain\SqlUser1 adatbázisnévként az Sales adatbázisban.
USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT USER_NAME();
GO
AZ EXECUTE AS CALLER önálló utasítás használata
EXECUTE AS CALLER A modulon belüli önálló utasítással állítsa be a végrehajtási környezetet a modul hívójának.
Tegyük fel, hogy a következő tárolt eljárást hívja meg a SqlUser2rendszer.
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
Egyéni engedélykészletek definiálása az EXECUTE AS használatával
A modul végrehajtási környezetének megadása akkor lehet hasznos, ha egyéni engedélykészleteket szeretne definiálni. Néhány művelet TRUNCATE TABLE például nem rendelkezik engedélyekkel. Az utasítás modulon belüli beépítésével TRUNCATE TABLE és a modul olyan felhasználóként való végrehajtásának megadásával, aki rendelkezik a tábla módosítására vonatkozó engedélyekkel, kiterjesztheti a táblát arra a felhasználóra, akinek engedélyt ad EXECUTE a modulhoz.
A modul definíciójának a megadott végrehajtási környezettel való megtekintéséhez használja a sys.sql_modules katalógusnézetet.
Ajánlott eljárások
Adjon meg egy olyan bejelentkezést vagy felhasználót, amely a modulban meghatározott műveletek végrehajtásához a legkevésbé szükséges jogosultságokkal rendelkezik. Ne adjon meg például adatbázis-tulajdonosi fiókot, hacsak nincs szükség ezekre az engedélyekre.
Permissions
A megadott EXECUTE ASmodul végrehajtásához a hívónak engedélyekkel kell rendelkeznie EXECUTE a modulhoz.
Egy olyan CLR-modul végrehajtásához, amely EXECUTE AS egy másik adatbázisban vagy kiszolgálón lévő erőforrásokhoz fér hozzá, a céladatbázisnak vagy -kiszolgálónak megbízhatónak kell lennie annak az adatbázisnak a hitelesítőjében, amelyből a modul származik (a forrásadatbázis).
A modul létrehozásakor vagy módosításakor a EXECUTE AS záradék megadásához rendelkeznie IMPERSONATE kell a megadott tagra vonatkozó engedélyekkel, valamint a modul létrehozásához szükséges engedélyekkel. Mindig megszemélyesítheted magad. Ha nincs megadva végrehajtási környezet, vagy EXECUTE AS CALLER nincs megadva, IMPERSONATE nincs szükség engedélyekre.
Ha olyan login_name vagy user_name szeretne megadni, amely implicit hozzáféréssel rendelkezik az adatbázishoz Windows-csoporttagságon keresztül, rendelkeznie CONTROL kell az adatbázisra vonatkozó engedélyekkel.
Példák
Az alábbi példa létrehoz egy tárolt eljárást az AdventureWorks2025 adatbázisban, és a végrehajtási kontextust a OWNER-hez rendeli.
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