Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:
Databricks SQL
Databricks Runtime
När Azure Databricks kör en SQL-instruktion spårar den två distinkta användare:
- Sessionsanvändare: den användare som är ansluten till Azure Databricks och utfärdade instruktionen. Sessionsanvändaren är fast under SQL-anslutningens livslängd. Den ändras inte när en -instruktion körs, även när -instruktionen når vyer, SQL UDF:er eller lagrade procedurer.
-
Behörig användare: den användare vars behörigheter kontrolleras när instruktionen som körs läser eller skriver objekt. Den behöriga användaren kan ändra när körningen går över till en vytext, en SQL UDF-brödtext eller en
SQL SECURITY DEFINERprocedurtext.
Funktionen session_user returnerar sessionsanvändaren.
Varning
Current_user- och användarfunktionerna är alias som också returnerar sessionsanvändaren, inte den auktoriserade användaren. I standard-SQL CURRENT_USER returnerar den auktoriserade användaren. I Azure Databricks det inte. Använd session_user för att uttryckligen referera till sessionsanvändaren.
Hur den auktoriserade användaren utvecklas
Varje anrop av en vy, SQL UDF eller lagrad procedur skickar en ny post i anropsstacken. Den behöriga användaren för en instruktion bestäms av den översta stackposten som åtgärdar en ägare:
| Object | Behörig användare i brödtexten |
|---|---|
| View | Vyägaren |
| SQL UDF | Funktionsägaren |
CREATE PROCEDURE ... SQL SECURITY DEFINER |
Procedurens ägare (definierare) |
CREATE PROCEDURE ... SQL SECURITY INVOKER |
Den auktoriserade användaren av anropande instruktionen (ärvd) |
Vyer, SQL UDF:er och SQL SECURITY DEFINER procedurer anger den behöriga användaren till sin ägare för alla instruktioner i brödtexten. En SQL SECURITY INVOKER procedur ärver den auktoriserade användaren från anroparen.
När en brödtext är klar med körningen och kontrollen återgår till anroparen, dyker den behöriga användaren tillbaka till vad den än var på samtalswebbplatsen.
Sessionsanvändaren ändras däremot aldrig under en enda anslutning. I en SQL SECURITY DEFINER procedurtext session_user() returnerar fortfarande den användare som utfärdade den ursprungliga instruktionen.
Behörigheter som kontrolleras på varje lager
Azure Databricks kontrollerar behörigheter mot den behöriga användaren vid varje körningslager:
- Sessionsanvändaren måste hålla kvar
EXECUTEden översta proceduren eller funktionen ochSELECTi vyn på den översta nivån. Sessionsanvändaren måste också haUSE CATALOGochUSE SCHEMApå de överordnade containrarna. - I en
SQL SECURITY INVOKERprocedurtext använder alla instruktioner sessionsanvändarens behörigheter, inklusive kapsladeEXECUTEanrop till andra rutiner. - I en
SQL SECURITY DEFINERprocedurtext, en vytext eller en SQL UDF-brödtext använder alla instruktioner ägarens behörigheter. Sessionsanvändaren behöver bara behörighet att anropa den yttre rutinen, inte behörigheter för objekten som brödtextreferenserna.
Example
Det här exemplet kedjar vyer, SQL UDF:er och lagrade procedurer som ägs av olika användare. Varje lager läser från lagret nedan, så auktoriseringen passerar hela stacken. Exemplet använder tre användare (Athos, Porthos och Aramis) och spårar vad som händer när Aramis, som endast har åtkomst till procedurerna på den översta nivån, anropar kedjan.
Inställningar
Athos skapar en tabell med två kolumner och ger Porthos läsåtkomst:
-- 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`;
Porthos skapar en vy över Athos tabell och ger Athos läsåtkomst i vyn:
-- 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`;
Athos skapar en SQL UDF som läser från Porthos vy och ger Porthos EXECUTE följande:
-- 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`;
Porthos skapar en SQL UDF som aggregerar resultat från Athos UDF och en SQL SECURITY DEFINER procedur som exponerar resultatet:
-- 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;
Athos skapar en SQL SECURITY INVOKER procedur som anropar Porthos procedur:
-- Run as Athos.
> CREATE PROCEDURE p_inv()
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
CALL p_def();
END;
Slutligen beviljar Athos och Porthos var och en Aramis vad han behöver för att anropa kedjan. Eftersom p_inv är en SQL SECURITY INVOKER procedur körs dess brödtext som den användare som kallade den (Aramis), och därför måste Aramis självständigt ha EXECUTE på 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`;
Aramis har inga behörigheter för t, f_a, v_peller f_p.
Aramis anropar kedjan
Problem med Aramis:
-- Run as Aramis.
> CALL p_inv();
Anropskedjan utvecklas på följande sätt, varje pil korsar in i en ny brödtext:
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)
Följande tabell går igenom instruktionerna när de körs.
| Step | Statement | Där den körs | Behöriga användare | session_user() |
|---|---|---|---|---|
| 1 | CALL p_inv() |
Aramis session | Aramis | Aramis |
| 2 | CALL p_def() |
Brödtext av p_inv (SQL SECURITY INVOKER) |
Aramis (ärvd från anroparen) | Aramis |
| 3 | SELECT f_p() |
Brödtext av p_def (SQL SECURITY DEFINER) |
Porthos (procedurägare) | Aramis |
| 4 | RETURN f_a(1) + f_a(2) + f_a(3) |
Brödtext för SQL UDF f_p |
Porthos (funktionsägare) | Aramis |
| 5 | RETURN (SELECT b100 FROM v_p WHERE a = p) |
Brödtext för SQL UDF f_a |
Athos (funktionsägare) | Aramis |
| 6 | SELECT a, b * 100 AS b100 FROM t |
Brödtext i vyn v_p |
Porthos (vyägare) | Aramis |
När körningen varvar ned, dyker den behöriga användaren upp lager för lager tills kontrollen återgår till Aramis session i steg 1.