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:
Databricks SQL
Databricks Runtime
Ha Azure Databricks SQL-utasítást futtat, két különböző felhasználót követ nyomon:
- Munkamenet-felhasználó: az a felhasználó, aki Azure Databricks csatlakozik, és kiadta az utasítást. A munkamenet-felhasználó az SQL-kapcsolat élettartamára van javítva. Az utasítás futása közben nem változik, még akkor sem, ha az utasítás nézetekbe, SQL UDF-ekbe vagy tárolt eljárásokba kerül.
-
Jogosult felhasználó: az a felhasználó, akinek a jogosultságait ellenőrzi a rendszer, amikor az aktuálisan végrehajtó utasítás beolvassa vagy írja az objektumokat. A jogosult felhasználó módosíthatja a végrehajtás során a nézettörzset, az SQL UDF-törzset vagy az eljárás törzsét
SQL SECURITY DEFINER.
A session_user függvény visszaadja a munkamenet-felhasználót.
Warning
A current_user és a felhasználói függvények olyan aliasok, amelyek a munkamenet felhasználóját is visszaadják, nem pedig a jogosult felhasználót. A standard SQL-ben a jogosult felhasználót adja vissza, CURRENT_USER Azure Databricks nem. A session_user használatával explicit módon hivatkozhat a munkamenet-felhasználóra.
A jogosult felhasználó fejlődése
A nézet, az SQL UDF vagy a tárolt eljárás minden egyes meghívása új bejegyzést küld a hívásverembe. Az utasítás jogosult felhasználóját a tulajdonost javító legfelső verembejegyzés határozza meg:
| Objektum | Jogosult felhasználó a törzsben |
|---|---|
| View | A nézet tulajdonosa |
| SQL UDF | A függvény tulajdonosa |
CREATE PROCEDURE ... SQL SECURITY DEFINER |
Az eljárás tulajdonosa (definiáló) |
CREATE PROCEDURE ... SQL SECURITY INVOKER |
A hívási utasítás jogosult felhasználója (örökölt) |
A nézetek, az SQL UDF-ek és SQL SECURITY DEFINER az eljárások a jogosult felhasználót a tulajdonosukra állítják a törzs összes utasításához. Egy SQL SECURITY INVOKER eljárás örökli a jogosult felhasználót a hívójától.
Amikor egy törzs befejezi a végrehajtást, és a vezérlés visszakerül a hívóhoz, a jogosult felhasználó visszaugrik a hívás helyszínére.
Ezzel szemben a munkamenet-felhasználó soha nem változik egyetlen kapcsolat során.
SQL SECURITY DEFINER Az eljárás törzsében session_user() továbbra is az eredeti utasítást kiadó felhasználót adja vissza.
Az egyes rétegekben ellenőrzött jogosultságok
Azure Databricks jogosultságokat ellenőriz a jogosult felhasználóval a végrehajtás minden egyes rétegében:
- A munkamenet-felhasználónak meg kell tartania
EXECUTEa legfelső szintű eljárást vagy függvényt, valamintSELECTa felső szintű nézetet. A munkamenet-felhasználónak rendelkeznieUSE CATALOGkell a szülőtárolókkal isUSE SCHEMA. -
SQL SECURITY INVOKERAz eljárás törzsén belül minden utasítás a munkamenet-felhasználó jogosultságait használja, beleértve a más rutinokra irányuló beágyazottEXECUTEhívásokat is. - Egy
SQL SECURITY DEFINEReljárástörzsben, egy nézettörzsben vagy egy SQL UDF-törzsben minden utasítás a tulajdonos jogosultságait használja. A munkamenet-felhasználónak csak a külső rutin meghívásához van szüksége jogosultságra, a törzshivatkozások objektumaihoz nem.
Példa
Ez a példa különböző felhasználók nézeteit, SQL UDF-eit és tárolt eljárásait láncolják. Az egyes rétegek az alábbi rétegből olvasnak, így az engedélyezés végigjárja a teljes vermet. A példa három felhasználót (Athos, Porthos és Aramis) használ, és nyomon követi, hogy mi történik, amikor Aramis, aki csak a legfelső szintű eljárásokhoz fér hozzá, meghívja a láncot.
Setup
Az Athos létrehoz egy kétoszlopos táblát, és olvasási hozzáférést biztosít a Porthosnak:
-- Run as Athos.
> CREATE TABLE t(a INT, b INT);
> INSERT INTO t VALUES (1, 10), (2, 20), (3, 30);
> GRANT SELECT ON TABLE t TO `porthos@musketeers.fr`;
A Porthos létrehoz egy nézetet az Athos táblája felett, és olvasási hozzáférést biztosít az Athosnak a nézetben:
-- Run as Porthos.
> CREATE VIEW v_p AS
SELECT a, b * 100 AS b100 FROM t;
> GRANT SELECT ON VIEW v_p TO `athos@musketeers.fr`;
Az Athos létrehoz egy SQL UDF-t, amely a Porthos nézetéből olvas, és porthosot EXECUTE ad hozzá:
-- Run as Athos.
> CREATE FUNCTION f_a(p INT) RETURNS INT
RETURN (SELECT b100 FROM v_p WHERE a = p);
> GRANT EXECUTE ON FUNCTION f_a TO `porthos@musketeers.fr`;
A Porthos létrehoz egy SQL UDF-t, amely összesíti az Athos UDF-jének eredményeit, és egy SQL SECURITY DEFINER olyan eljárást, amely közzéteszi az eredményt:
-- Run as Porthos.
> CREATE FUNCTION f_p() RETURNS INT
RETURN f_a(1) + f_a(2) + f_a(3);
> CREATE PROCEDURE p_def()
LANGUAGE SQL
SQL SECURITY DEFINER
AS BEGIN
SELECT f_p();
END;
Az Athos létrehoz egy SQL SECURITY INVOKER eljárást, amely meghívja a Porthos eljárását:
-- Run as Athos.
> CREATE PROCEDURE p_inv()
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
CALL p_def();
END;
Végül Athos és Porthos megadják Aramisnak, hogy mire van szüksége a lánc meghívásához. Mivel p_inv ez egy SQL SECURITY INVOKER eljárás, a törzse az azt (Aramis) nevező felhasználóként fut, így az Aramisnak egymástól függetlenül kell rendelkeznie EXECUTE a következővel p_def:
-- Run as Athos.
> GRANT EXECUTE ON PROCEDURE p_inv TO `aramis@musketeers.fr`;
-- Run as Porthos.
> GRANT EXECUTE ON PROCEDURE p_def TO `aramis@musketeers.fr`;
Az Aramis nem rendelkezik jogosultságokkal az t, f_a, v_pvagy f_p.
Az Aramis meghívja a láncot
Aramis-problémák:
-- Run as Aramis.
> CALL p_inv();
A híváslánc az alábbiak szerint bontakozik ki, és mindegyik nyíl egy új törzsbe lép:
Aramis's session
│
│ CALL
▼
p_inv() (Athos, SQL SECURITY INVOKER)
│
│ CALL
▼
p_def() (Porthos, SQL SECURITY DEFINER)
│
│ SELECT
▼
f_p() (Porthos's SQL UDF)
│
│ invokes
▼
f_a(p) (Athos's SQL UDF)
│
│ SELECT
▼
v_p (Porthos's view)
│
│ SELECT
▼
t (Athos's table)
Az alábbi táblázat végigvezeti az utasításokat a végrehajtás során.
| Step | Statement | A futtatás helye | Jogosult felhasználó | session_user() |
|---|---|---|---|---|
| 1 | CALL p_inv() |
Aramis előadása | Aramis | Aramis |
| 2 | CALL p_def() |
Törzse p_inv (SQL SECURITY INVOKER) |
Aramis (a hívótól örökölt) | Aramis |
| 3 | SELECT f_p() |
Törzse p_def (SQL SECURITY DEFINER) |
Porthos (eljárás tulajdonosa) | Aramis |
| 4 | RETURN f_a(1) + f_a(2) + f_a(3) |
Az SQL UDF törzse f_p |
Porthos (függvény tulajdonosa) | Aramis |
| 5 | RETURN (SELECT b100 FROM v_p WHERE a = p) |
Az SQL UDF törzse f_a |
Athos (függvény tulajdonosa) | Aramis |
| 6 | SELECT a, b * 100 AS b100 FROM t |
Nézet törzse v_p |
Porthos (nézet tulajdonosa) | Aramis |
A végrehajtás kikapcsolásakor az engedélyezett felhasználó rétegről rétegre előugrik, amíg a vezérlő vissza nem tér az Aramis munkamenetéhez az 1. lépésben.