Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:
Databricks SQL
Databricks Runtime
Saat Azure Databricks menjalankan pernyataan SQL, ia melacak dua pengguna yang berbeda:
- Pengguna sesi: pengguna yang terhubung ke Azure Databricks dan mengeluarkan pernyataan. Pengguna sesi diperbaiki selama masa pakai koneksi SQL. Ini tidak berubah saat pernyataan berjalan, bahkan ketika pernyataan mencapai tampilan, SQL UDF, atau prosedur tersimpan.
-
Pengguna yang berwenang: pengguna yang hak istimewanya diperiksa ketika pernyataan yang sedang dijalankan membaca atau menulis objek. Pengguna yang berwenang dapat berubah saat eksekusi menyeberang ke isi tampilan, isi UDF SQL, atau
SQL SECURITY DEFINERisi prosedur.
Fungsi session_user mengembalikan pengguna sesi.
Warning
Fungsi current_user dan pengguna adalah alias yang juga mengembalikan pengguna sesi, bukan pengguna yang berwenang. Di SQL standar, CURRENT_USER mengembalikan pengguna yang diotorisasi; dalam Azure Databricks tidak. Gunakan session_user untuk merujuk ke pengguna sesi secara eksplisit.
Bagaimana pengguna yang berwenang berkembang
Setiap pemanggilan tampilan, SQL UDF, atau prosedur tersimpan mendorong entri baru pada tumpukan panggilan. Pengguna yang berwenang untuk pernyataan ditentukan oleh entri tumpukan paling atas yang memperbaiki pemilik:
| Objek | Pengguna yang berwenang di dalam isi |
|---|---|
| View | Pemilik tampilan |
| SQL UDF | Pemilik fungsi |
CREATE PROCEDURE ... SQL SECURITY DEFINER |
Pemilik prosedur (pendefinisi) |
CREATE PROCEDURE ... SQL SECURITY INVOKER |
Pengguna resmi pernyataan panggilan (diwariskan) |
Tampilan, SQL UDF, dan SQL SECURITY DEFINER prosedur mengatur pengguna yang berwenang ke pemilik mereka untuk semua pernyataan dalam isi. Prosedur SQL SECURITY INVOKER mewarisi pengguna yang berwenang dari pemanggilnya.
Ketika isi selesai dieksekusi dan kontrol kembali ke pemanggil, pengguna yang berwenang muncul kembali ke apa pun yang ada di situs panggilan.
Pengguna sesi, sebaliknya, tidak pernah berubah selama satu koneksi.
SQL SECURITY DEFINER Di dalam isi prosedur, session_user() masih mengembalikan pengguna yang mengeluarkan pernyataan asli.
Hak istimewa diperiksa di setiap lapisan
Azure Databricks memeriksa hak istimewa terhadap pengguna yang berwenang di setiap lapisan eksekusi:
- Pengguna sesi harus memegang
EXECUTEprosedur atau fungsi tingkat atas danSELECTpada tampilan tingkat atas. Pengguna sesi juga harus memilikiUSE CATALOGdanUSE SCHEMApada kontainer induk. -
SQL SECURITY INVOKERDi dalam isi prosedur, semua pernyataan menggunakan hak istimewa pengguna sesi, termasuk panggilan berlapisEXECUTEke rutinitas lain. -
SQL SECURITY DEFINERDi dalam isi prosedur, isi tampilan, atau isi UDF SQL, semua pernyataan menggunakan hak istimewa pemilik. Pengguna sesi hanya memerlukan hak istimewa untuk memanggil rutinitas luar, bukan hak istimewa pada objek yang dirujuk isi.
Example
Contoh ini menautkan tampilan, SQL UDF, dan prosedur tersimpan yang dimiliki oleh pengguna yang berbeda. Setiap lapisan membaca dari lapisan di bawah ini, sehingga otorisasi melintasi tumpukan penuh. Contohnya menggunakan tiga pengguna (Athos, Porthos, dan Aramis) dan melacak apa yang terjadi ketika Aramis, yang hanya memiliki akses ke prosedur tingkat atas, memanggil rantai.
Siapkan
Athos membuat tabel dua kolom dan memberikan akses baca Porthos:
-- 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 membuat tampilan di atas tabel Athos dan memberikan akses baca Athos pada tampilan:
-- 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 membuat SQL UDF yang berbunyi dari tampilan Porthos, dan memberikan Porthos EXECUTE di atasnya:
-- 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 membuat UDF SQL yang menggabungkan hasil dari UDF Athos, dan SQL SECURITY DEFINER prosedur yang mengekspos hasilnya:
-- 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 SQL SECURITY INVOKER membuat prosedur yang memanggil prosedur Porthos:
-- Run as Athos.
> CREATE PROCEDURE p_inv()
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
CALL p_def();
END;
Akhirnya, Athos dan Porthos masing-masing memberikan Aramis apa yang dia butuhkan untuk memanggil rantai. Karena p_inv merupakan SQL SECURITY INVOKER prosedur, tubuhnya berjalan sebagai pengguna yang menyebutnya (Aramis), sehingga Aramis harus memiliki secara EXECUTE independen pada 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 tidak memiliki hak istimewa pada t, , f_av_p, atau f_p.
Aramis memanggil rantai
Masalah Aramis:
-- Run as Aramis.
> CALL p_inv();
Rantai panggilan terungkap sebagai berikut, setiap panah menyeberang ke tubuh baru:
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)
Tabel berikut berjalan melalui pernyataan saat dijalankan.
| Step | Statement | Tempat berjalannya | Pengguna yang diotorisasi | session_user() |
|---|---|---|---|---|
| 1 | CALL p_inv() |
Sesi Aramis | Aramis | Aramis |
| 2 | CALL p_def() |
Isi p_inv (SQL SECURITY INVOKER) |
Aramis (diwariskan dari pemanggil) | Aramis |
| 3 | SELECT f_p() |
Isi p_def (SQL SECURITY DEFINER) |
Porthos (pemilik prosedur) | Aramis |
| 4 | RETURN f_a(1) + f_a(2) + f_a(3) |
Isi SQL UDF f_p |
Porthos (pemilik fungsi) | Aramis |
| 5 | RETURN (SELECT b100 FROM v_p WHERE a = p) |
Isi SQL UDF f_a |
Athos (pemilik fungsi) | Aramis |
| 6 | SELECT a, b * 100 AS b100 FROM t |
Isi tampilan v_p |
Porthos (lihat pemilik) | Aramis |
Saat eksekusi melepas lelah, pengguna yang berwenang memunculkan kembali lapisan demi lapisan hingga kontrol kembali ke sesi Aramis pada langkah 1.