Yetkili kullanıcı ve oturum kullanıcısı

Şunun için geçerlidir:Evet olarak işaretlendi Databricks SQL Evet olarak işaretlendi Databricks Runtime

Azure Databricks bir SQL deyimi çalıştırdığında iki ayrı kullanıcıyı izler:

  • Oturum kullanıcısı: Azure Databricks bağlanan ve deyimini veren kullanıcı. Oturum kullanıcısı SQL bağlantısının ömrü boyunca sabittir. Deyim görünümlere, SQL UDF'lerine veya saklı yordamlara ulaştığında bile bir deyim çalışırken değişmez.
  • Yetkili kullanıcı: Şu anda yürütülen deyim nesneleri okuduğunda veya yazdığında ayrıcalıkları denetlenen kullanıcı. Yürütme bir görünüm gövdesine, SQL UDF gövdesine veya SQL SECURITY DEFINER yordam gövdesine geçerken yetkili kullanıcı değişebilir.

session_user işlevi oturum kullanıcısını döndürür.

Warning

current_user ve kullanıcı işlevleri, yetkili kullanıcıyı değil oturum kullanıcısını döndüren diğer adlardır. Standart SQL'de CURRENT_USER yetkili kullanıcıyı döndürür; Azure Databricks döndürmez. Oturum kullanıcısına açıkça başvurmak için session_user kullanın.

Yetkili kullanıcı nasıl gelişir?

Bir görünümün, SQL UDF'nin veya saklı yordamın çağrı yığınına yeni bir giriş göndermesi. Bir deyimi için yetkili kullanıcı, bir sahibi düzelten en üstteki yığın girdisi tarafından belirlenir:

Nesne Gövde içindeki yetkili kullanıcı
View Görünüm sahibi
SQL UDF İşlev sahibi
CREATE PROCEDURE ... SQL SECURITY DEFINER Yordam sahibi (tanımlayıcı)
CREATE PROCEDURE ... SQL SECURITY INVOKER Çağrı deyiminin yetkili kullanıcısı (devralındı)

Görünümler, SQL UDF'leri ve SQL SECURITY DEFINER yordamlar, yetkili kullanıcıyı gövdedeki tüm deyimler için sahiplerine ayarlar. Yordam SQL SECURITY INVOKER , yetkili kullanıcıyı çağırandan devralır.

Bir gövde yürütmeyi bitirdiğinde ve denetim çağırana geri döndüğünde, yetkili kullanıcı çağrı sitesinde olduğu her şeye geri döner.

Buna karşılık, oturum kullanıcısı tek bir bağlantı sırasında hiçbir zaman değişmez. Bir SQL SECURITY DEFINER yordam gövdesinin içinde, session_user() özgün deyimini veren kullanıcıyı döndürür.

Her katmanda denetlenen ayrıcalıklar

Azure Databricks, her yürütme katmanında yetkili kullanıcıya karşı ayrıcalıkları denetler:

  • Oturum kullanıcısının üst düzey yordam veya işlevde ve EXECUTE üst düzey görünümde tutması SELECT gerekir. Oturum kullanıcısının da üst kapsayıcılarda ve USE CATALOG olması USE SCHEMA gerekir.
  • Yordam SQL SECURITY INVOKER gövdesinde tüm deyimler, diğer yordamlara yapılan iç içe EXECUTE çağrılar dahil olmak üzere oturum kullanıcısının ayrıcalıklarını kullanır.
  • SQL SECURITY DEFINER Yordam gövdesi, görünüm gövdesi veya SQL UDF gövdesi içinde, tüm deyimler sahibin ayrıcalıklarını kullanır. Oturum kullanıcısı yalnızca dış yordamı çağırma ayrıcalığına ihtiyaç duyar, gövdenin başvurdığı nesnelerdeki ayrıcalıkları değil.

Example

Bu örnek görünümleri, SQL UDF'lerini ve farklı kullanıcıların sahip olduğu saklı yordamları zincirler. Her katman aşağıdaki katmandan okur, bu nedenle yetkilendirme tam yığından geçiş sağlar. Örnek üç kullanıcı (Athos, Porthos ve Aramis) kullanır ve yalnızca en üst düzey yordamlara erişimi olan Aramis zinciri çağırdığında ne olduğunu izler.

Kurulum

Athos iki sütunlu bir tablo oluşturur ve Porthos'a okuma erişimi verir:

-- 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, Athos'un tablosu üzerinde bir görünüm oluşturur ve Athos'a görünümde okuma erişimi verir:

-- 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, Porthos'un görünümünden okuyan bir SQL UDF oluşturur ve bu görünümde Porthos'a EXECUTE verir:

-- 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, Athos'un UDF'sinden sonuçları toplayan bir SQL UDF ve sonucu kullanıma sunan bir SQL SECURITY DEFINER yordam oluşturur:

-- 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, Porthos'un yordamını çağıran bir SQL SECURITY INVOKER yordam oluşturur:

-- Run as Athos.
> CREATE PROCEDURE p_inv()
    LANGUAGE SQL
    SQL SECURITY INVOKER
    AS BEGIN
      CALL p_def();
    END;

Son olarak, Athos ve Porthos aramis'e zinciri çağırmak için gerekenleri verir. Bir p_inv yordam olduğundanSQL SECURITY INVOKER, gövdesi onu çağıran kullanıcı (Aramis) olarak çalışır ve bu nedenle Aramis bağımsız olarak üzerinde EXECUTEolmalıdırp_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'in , , tf_aveya v_püzerinde f_phiçbir ayrıcalığı yoktur.

Aramis zinciri çağırır

Aramis sorunları:

-- Run as Aramis.
> CALL p_inv();

Çağrı zinciri aşağıdaki gibi ortaya çıkar ve her ok yeni bir gövdeye geçer:

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)

Aşağıdaki tabloda, yürütülürken deyimler gösterilir.

Step İfade Nerede çalıştırılır Yetkilendiren kullanıcı session_user()
1 CALL p_inv() Aramis'in oturumu Aramis Aramis
2 CALL p_def() p_inv Gövdesi (SQL SECURITY INVOKER) Aramis (çağırandan devralınmış) Aramis
3 SELECT f_p() p_def Gövdesi (SQL SECURITY DEFINER) Porthos (yordam sahibi) Aramis
4 RETURN f_a(1) + f_a(2) + f_a(3) SQL UDF Gövdesi f_p Porthos (işlev sahibi) Aramis
5 RETURN (SELECT b100 FROM v_p WHERE a = p) SQL UDF Gövdesi f_a Athos (işlev sahibi) Aramis
6 SELECT a, b * 100 AS b100 FROM t Görünüm gövdesi v_p Porthos (görünüm sahibi) Aramis

Yürütme geri sarıldığında, denetim 1. adımda Aramis'in oturumuna dönene kadar yetkili kullanıcı katman katman geri açılır.