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:
Databricks SQL
Databricks Runtime
Když Azure Databricks spustí příkaz SQL, sleduje dva různé uživatele:
- Uživatel relace: uživatel, který je připojený k Azure Databricks a vydal příkaz. Uživatel relace je opravený po celou dobu životnosti připojení SQL. Během spuštění příkazu se nezmění, a to ani v případě, že příkaz přejde do zobrazení, funkcí DEFINOVANÝch uživatelem SQL nebo uložených procedur.
-
Autorizovaný uživatel: uživatel, jehož oprávnění jsou kontrolována, když aktuálně spouštěný příkaz čte nebo zapisuje objekty. Autorizovaný uživatel se může změnit jako křížek provádění do textu zobrazení, textu uživatele SQL nebo
SQL SECURITY DEFINERtextu procedury.
Funkce session_user vrátí uživatele relace.
Warning
Current_user a uživatelské funkce jsou aliasy, které také vracejí uživatele relace, nikoli autorizovaného uživatele. Ve standardním SQL CURRENT_USER vrátí autorizovaný uživatel; v Azure Databricks ne. Pomocí session_user můžete explicitně odkazovat na uživatele relace.
Jak se autorizovaný uživatel vyvíjí
Každé vyvolání zobrazení, funkce DEFINOVANÁ uživatelem SQL nebo uložená procedura odešle novou položku do zásobníku volání. Autorizovaný uživatel pro příkaz je určen nejvyšší položkou zásobníku, která opravuje vlastníka:
| Object | Autorizovaný uživatel uvnitř textu |
|---|---|
| View | Vlastník zobrazení |
| SQL UDF | Vlastník funkce |
CREATE PROCEDURE ... SQL SECURITY DEFINER |
Vlastník procedury (definer) |
CREATE PROCEDURE ... SQL SECURITY INVOKER |
Autorizovaný uživatel volajícího příkazu (zděděný) |
Zobrazení, uživatelem definované uživatelem SQL a SQL SECURITY DEFINER procedury nastavují autorizovaného uživatele pro všechny příkazy v těle. Procedura SQL SECURITY INVOKER dědí autorizovaného uživatele z volajícího.
Když tělo dokončí provádění a řízení se vrátí volajícímu, autorizovaný uživatel se vrátí zpět na cokoli, co bylo na webu volání.
Uživatel relace se naopak během jednoho připojení nikdy nezmění.
SQL SECURITY DEFINER Uvnitř těla procedury stále vrací uživatele, session_user() který vydal původní příkaz.
Oprávnění kontrolovaná v každé vrstvě
Azure Databricks kontroluje oprávnění vůči autorizovanému uživateli v každé vrstvě provádění:
- Uživatel relace musí držet
EXECUTEproceduru nebo funkci nejvyšší úrovně aSELECTv zobrazení nejvyšší úrovně. Uživatel relace musí mítUSE CATALOGtaké nadřazené kontejnery aUSE SCHEMAv nadřazených kontejnerech. -
SQL SECURITY INVOKERV těle procedury používají všechny příkazy oprávnění uživatele relace, včetně všech vnořenýchEXECUTEvolání jiných rutin. -
SQL SECURITY DEFINERV těle procedury, textu zobrazení nebo textu uživatele SQL používají všechny příkazy oprávnění vlastníka. Uživatel relace potřebuje pouze oprávnění k vyvolání vnější rutiny, nikoli oprávnění k objektům, na které odkazuje tělo.
Example
Tento příklad zřetědí zobrazení, uživatelem definované uživatelem SQL a uložené procedury vlastněné různými uživateli. Každá vrstva čte z níže uvedené vrstvy, takže autorizace prochází celým zásobníkem. Příklad používá tři uživatele (Athos, Porthos a Aramis) a trasuje, co se stane, když Aramis, který má přístup pouze k procedurám nejvyšší úrovně, vyvolá řetěz.
Nastavení
Athos vytvoří tabulku se dvěma sloupci a udělí Porthos přístup pro čtení:
-- 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 vytvoří zobrazení nad tabulkou Athos a udělí Athos přístup pro čtení v zobrazení:
-- 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 vytvoří UDF SQL, který čte ze zobrazení Porthos, a udělí mu porthos EXECUTE :
-- 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 vytvoří definovanou uživatelem SQL, která agreguje výsledky z funkce definované uživatelem Athosu, a procedura SQL SECURITY DEFINER , která zpřístupňuje výsledek:
-- 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 vytvoří proceduru SQL SECURITY INVOKER , která volá proceduru Porthos:
-- Run as Athos.
> CREATE PROCEDURE p_inv()
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
CALL p_def();
END;
Athos a Porthos každý uděluje Aramis, co potřebuje k vyvolání řetězce. Protože p_inv je procedura SQL SECURITY INVOKER , její tělo běží jako uživatel, který ho nazval (Aramis), a proto Aramis musí mít nezávisle EXECUTE na 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 nemá žádná oprávnění k t, f_a, v_pnebo f_p.
Aramis vyvolá řetězec
Problémy s Aramis:
-- Run as Aramis.
> CALL p_inv();
Řetězec volání se rozbalí následujícím způsobem, přičemž každá šipka překračuje do nového těla:
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)
Následující tabulka vás provede příkazy při jejich provádění.
| Step | Statement | Kde běží | Oprávněný uživatel | session_user() |
|---|---|---|---|---|
| 1 | CALL p_inv() |
Relace Aramis | Aramis | Aramis |
| 2 | CALL p_def() |
Text (p_invSQL SECURITY INVOKER) |
Aramis (zděděný z volajícího) | Aramis |
| 3 | SELECT f_p() |
Text (p_defSQL SECURITY DEFINER) |
Porthos (vlastník procedury) | Aramis |
| 4 | RETURN f_a(1) + f_a(2) + f_a(3) |
Text uživatelem definovaného uživatelem SQL f_p |
Porthos (vlastník funkce) | Aramis |
| 5 | RETURN (SELECT b100 FROM v_p WHERE a = p) |
Text uživatelem definovaného uživatelem SQL f_a |
Athos (vlastník funkce) | Aramis |
| 6 | SELECT a, b * 100 AS b100 FROM t |
Základní text zobrazení v_p |
Porthos (zobrazit vlastníka) | Aramis |
Při spuštění se autorizovaný uživatel zobrazí zpět vrstvu po vrstvě, dokud se ovládací prvek nevrátí do relace Aramis v kroku 1.