Model izin tingkat skema (SLPM) memusatkan pengelolaan izin di Hologres. Alih-alih memberikan hak istimewa tingkat tabel satu per satu, SLPM mengelompokkan pengguna ke dalam kelompok bawaan—admin, developer, writer, dan viewer—lalu menerapkan izin secara otomatis pada tingkat skema. Cukup tambahkan pengguna ke kelompok yang sesuai; tidak diperlukan pernyataan GRANT atau ALTER DEFAULT PRIVILEGES.
Halaman ini menjelaskan cara mengaktifkan SLPM, mengelola keanggotaan kelompok pengguna, serta menangani operasi siklus hidup seperti menonaktifkan dan mengaktifkan kembali model tersebut.
Batasan
SLPM menerapkan isolasi ketat tingkat skema. Sebelum mengaktifkannya, perhatikan hal-hal berikut:
-
Tampilan dan aturan lintas-skema tidak didukung. Jika suatu tampilan atau aturan mereferensikan tabel dari lebih dari satu skema, tampilan atau aturan tersebut menjadi tidak dapat diakses dan mengembalikan
ERROR: permission denied for table. Hindari pembuatan tampilan atau aturan lintas-skema di database yang dikelola oleh SLPM. Untuk pengecualian yang tersedia mulai V1.3.36 dan versi setelahnya, lihat Create cross-schema views in SLPM mode (Beta). -
Perintah DDL standar digantikan oleh padanan SLPM. Tabel berikut mencantumkan perintah yang terpengaruh.
Perintah standar Alasan penggantian Padanan SLPM alter table owner to xxSemua tabel dimiliki oleh kelompok developerskema secara otomatis.Tidak diperlukan. grantIzin diberikan dengan menambahkan pengguna ke kelompok. slpm_grantrevokeIzin dicabut dengan menghapus pengguna dari kelompok. slpm_revokealter default privilegesTabel baru mewarisi izin secara otomatis berdasarkan kelompok pengguna. Tidak diperlukan. create / drop / alter / renamepada kelompok pengguna bawaanKeempat kelompok bawaan dikelola oleh sistem. Tidak berlaku. rename schemaPenggantian nama skema harus melalui SLPM agar ikatan kelompok tetap konsisten. slpm_rename_schemadrop databaseKelompok pengguna harus dibersihkan setelah database dihapus. Jalankan drop database, lalu panggilslpm_cleanup('<DBNAME>'). -
Nama akun kustom tidak boleh diakhiri dengan
admin,developer,writer,viewer, atauall_users.
Aktifkan SLPM
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
-
Akses superuser ke instans Hologres
-
Tool pengembangan yang terhubung ke instans (misalnya, HoloWeb atau psql)
Aktifkan SLPM untuk database
-
Instal ekstensi SLPM. Jalankan perintah ini sekali per database.
create extension slpm; -
Aktifkan SLPM. Pastikan tidak ada pernyataan SQL yang sedang berjalan di database saat menjalankan perintah ini.
call slpm_enable (); -
(Opsional) Migrasi dari model izin PostgreSQL standar. Jika database sudah memiliki tabel, tampilan, atau tabel eksternal yang dikelola dengan model PostgreSQL standar, migrasikan kepemilikan objek yang ada ke SLPM menggunakan perintah berikut.
Untuk memeriksa model izin aktif sebelum migrasi:
-
Masuk ke Hologres console. Di panel navigasi kiri, klik Go to HoloWeb.
-
Klik Security Center. Di halaman DB Authorization, periksa model izin saat ini.
slpm_migratememproses hingga 64 pengguna per eksekusi (dapat disesuaikan). Jika database memiliki lebih banyak pengguna, jalankan fungsi ini beberapa kali hingga semua izin dimigrasikan. Untuk detail parameter, lihat slpm_migrate.-- Transfer ownership of existing objects to the developer group for SLPM management. call slpm_migrate (); -
Berikan izin
Izin SLPM diberikan dengan menambahkan pengguna ke kelompok pengguna. Setiap kelompok dipetakan ke skema dan tingkat izin tertentu:
| Kelompok | Format | Izin |
|---|---|---|
admin |
{dbname}.admin |
Administrasi database |
developer |
{dbname}.{schemaname}.developer |
Baca dan tulis, DDL |
writer |
{dbname}.{schemaname}.writer |
Baca dan tulis |
viewer |
{dbname}.{schemaname}.viewer |
Hanya baca |
Untuk detail lengkap tentang kemampuan masing-masing kelompok, lihat User groups and permissions in SLPM.
Langkah 1: Buat pengguna
Lewati langkah ini jika pengguna sudah ada di instans.
-- Create a user.
call slpm_create_user('<ACCOUNT>');
-- Create a user and add them to a group in one step.
call slpm_create_user('<ACCOUNT>', '{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]');
Ganti <ACCOUNT> dengan salah satu format berikut:
| Jenis akun | Format | Contoh |
|---|---|---|
| ID akun Alibaba Cloud | ID numerik | 197006222995xxx |
| Alibaba Cloud Mailbox | ALIYUN$xxx atau "xxx@aliyun.com" (diapit tanda kutip ganda) |
"xxx@aliyun.com" |
| Pengguna RAM | RAM$mainaccount:subuser |
RAM$mycompany:alice |
| UID Pengguna RAM | p4_UID |
p4_564306222995xxx |
Untuk menggunakan UID Pengguna RAM, tambahkan awalan p4_. Dapatkan UID dari halaman Users di Konsol RAM. Untuk informasi lebih lanjut tentang format akun, lihat Account system.
Langkah 2: Tambahkan pengguna ke kelompok
call slpm_grant('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<ACCOUNT>');
Jika Anda sudah menambahkan pengguna ke kelompok saat pembuatan, lewati langkah ini.
Contoh:
Contoh berikut menambahkan akun Alibaba Cloud ke kelompok admin mydb.
call slpm_grant('mydb.admin', '197006222995xxx');
call slpm_grant('mydb.admin', 'ALIYUN$xxx');
Contoh berikut menambahkan pengguna ke kelompok developer skema public di mydb.
call slpm_grant('mydb.public.developer', '197006222995xxx');
call slpm_grant('mydb.public.developer', 'RAM$mainaccount:subuser');
Contoh berikut menambahkan pengguna ke kelompok viewer skema lisa di MYDB (nama database case-sensitive).
call slpm_grant('"MYDB.lisa.viewer"', '197006222995xxx');
call slpm_grant('mydb.lisa.viewer', '"xxx@aliyun.com"');
Hapus pengguna dari kelompok
Menghapus pengguna dari kelompok mencabut semua izin yang terkait dengan kelompok tersebut.
call slpm_revoke('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<ACCOUNT>');
Contoh:
Contoh berikut menghapus pengguna dari kelompok admin dbname.
call slpm_revoke('dbname.admin', 'p4_564306222995xxx');
call slpm_revoke('dbname.admin', '197006222995xxx');
call slpm_revoke('dbname.admin', '"xxx@aliyun.com"');
Contoh berikut menghapus pengguna RAM dari kelompok developer skema lisa di mydb.
call slpm_revoke('mydb.lisa.developer', 'RAM$mainaccount:subuser');
call slpm_revoke('mydb.public.developer', 'p4_564306222995xxx');
Contoh berikut menghapus pengguna RAM dari kelompok viewer SCHEMA1 di MYDB (nama case-sensitive).
call slpm_revoke('"MYDB.SCHEMA1.viewer"', 'p4_564306222995xxx');
Hapus pengguna
Menghapus pengguna mengeluarkannya dari instans dan mencabut semua izin tingkat instans. Tindakan ini tidak dapat dikembalikan.
DROP ROLE "<ACCOUNT>";
Nonaktifkan SLPM
Langkah 1: Nonaktifkan model
Hanya superuser yang dapat menonaktifkan SLPM.
call slpm_disable ();
Setelah dinonaktifkan:
-
Keempat kelompok pengguna (
{db}.admin,{db}.{schemaname}.developer,{db}.{schemaname}.writer,{db}.{schemaname}.viewer) mempertahankan izin mereka pada objek yang sudah ada. Izin tersebut tidak berlaku untuk objek baru. -
PUBLIC diberikan izin berikut:
USAGEdanCREATEpada skema public;CONNECTdanTEMPORARYpada database;EXECUTEpada fungsi dan prosedur;USAGEpada bahasa dan tipe data (termasuk domain). -
PUBLIC tidak diberikan izin pada tabel, tampilan, tampilan yang di-materialisasi, kolom tabel, sequence, pembungkus data asing, server asing, atau skema non-public. Hubungi superuser untuk memberikan izin tersebut satu per satu.
Langkah 2: Bersihkan kelompok pengguna (opsional)
Kelompok pengguna tidak dihapus secara otomatis saat SLPM dinonaktifkan. Untuk menghapusnya, panggil slpm_cleanup.
Pastikan tidak ada pernyataan SQL yang sedang berjalan di database sebelum memanggilslpm_cleanup.slpm_cleanupmentransfer kepemilikan objek dalam batch berisi 64 objek (dapat disesuaikan). Jalankan beberapa kali jika diperlukan, tetapi hindari lebih dari lima kali eksekusi. Untuk detailnya, lihat slpm_cleanup.
Skenario 1: Hapus kelompok pengguna tetapi pertahankan database.
Jalankan perintah berikut di database target sebagai superuser.
call slpm_cleanup('<DBNAME>');
Skenario 2: Hapus kelompok pengguna setelah database dihapus.
Jalankan perintah berikut di database lain (misalnya, postgres) sebagai superuser.
call slpm_cleanup('mydb');
Aktifkan kembali SLPM
-
Bersihkan izin yang ada untuk mencegah konflik.
call slpm_cleanup ( '<DBNAME>' ); -
Aktifkan kembali SLPM dalam mode pemulihan, lalu transfer kepemilikan objek.
-- Enable SLPM in recovery mode. call slpm_enable ('t'); -- Transfer ownership of existing objects to the developer group. call slpm_migrate (); -
Berikan izin kepada pengguna. Gunakan
slpm_grantseperti dijelaskan dalam Grant permissions, atau gunakan Konsol Hologres. Untuk detailnya, lihat Grant permissions.
Create cross-schema views in SLPM mode (Beta)
Tampilan lintas-skema memerlukan Hologres V1.3.36 atau versi setelahnya. Jika instans Anda menggunakan versi sebelumnya, lihat Common errors that occur when you prepare for an instance upgrade atau hubungi dukungan melalui online support.
Secara default, SLPM tidak mengizinkan tampilan yang mereferensikan tabel dari lebih dari satu skema. Fitur tampilan lintas-skema menghilangkan batasan ini untuk kasus penggunaan tertentu.
Kapan menggunakan fitur ini
Pola umum gudang data adalah mengorganisasi data ke dalam skema berlapis—misalnya, gudang data operasi (ODS), DWD, layanan gudang data (DWS), dan ADS—lalu membuat tampilan ringkasan di lapisan luar yang melakukan join tabel dari beberapa lapisan dalam.
Pertimbangkan contoh berikut di mana tampilan di skema ads melakukan join tabel dari ods dan dwd:
| Database | Skema | Objek |
|---|---|---|
erp_db |
ods |
Tabel: orders |
erp_db |
dwd |
Tabel: customer |
erp_db |
ads |
Tampilan: customer_total_order_price_view |
DDL tampilan:
CREATE VIEW ads.customer_total_order_price_view AS
SELECT
c_name,
sum(o_totalprice)
FROM
ods.orders AS o
INNER JOIN dwd.customer AS c
ON o.o_custkey = c.c_custkey
GROUP BY
1;
Persyaratan izin
| Tindakan | Izin yang diperlukan |
|---|---|
| Membuat tampilan lintas-skema | developer pada skema tempat tampilan berada, ditambah viewer atau lebih tinggi pada semua tabel yang digunakan dalam tampilan |
| Menanyakan tampilan lintas-skema | viewer atau lebih tinggi pada skema tempat tampilan berada |
| Memodifikasi atau menghapus tampilan lintas-skema | Harus merupakan pemilik tampilan |
Dalam contoh di atas, untuk membuat ads.customer_total_order_price_view sebagai ads_dev_user:
-
Berikan izin
developerkepadaads_dev_userpadaads. -
Berikan izin
viewerkepadaads_dev_userpadaodsdandwd.
Untuk mengizinkan ads_view_user menanyakan tampilan tersebut, berikan izin viewer kepada ads_view_user pada ads.
Setelah Anda beralih dari model izin sederhana (SPM) ke SLPM, tampilan lintas-skema yang sudah ada menjadi tidak dapat diakses, dan kueri terhadapnya gagal dengan error permission denied for table. Jalankan perintah berikut sebagai superuser untuk mengaktifkan fitur tampilan lintas-skema, lalu buat ulang tampilan lintas-skema yang ada:
call slpm_enable_multi_schema_view();
-- Re-create the cross-schema view
CREATE OR REPLACE VIEW schema_b.cross_schema_view AS
SELECT a.id, a.name, b.value
FROM schema_a.table_a a
JOIN schema_b.table_b b ON a.id = b.id;
Mengaktifkan fitur saja, tanpa membuat ulang tampilan, tidak akan menyelesaikan error izin tersebut.
Aktifkan fitur tampilan lintas-skema
Jalankan perintah berikut sebagai superuser.
call slpm_enable_multi_schema_view();
Transfer kepemilikan tampilan
Setelah fitur diaktifkan, pengguna yang membuat tampilan menjadi pemiliknya. Hanya pemilik yang dapat memodifikasi atau menghapusnya. Untuk mentransfer kepemilikan—misalnya, sebelum menghapus pengguna dari database—jalankan perintah berikut. Pemilik baru harus memiliki izin developer pada skema tampilan dan viewer atau lebih tinggi pada semua skema sumber.
-- Syntax
call slpm_alter_view_owner('<VIEW_NAME>', '<ACCOUNT>');
-- Example: transfer ownership of ads.customer_total_order_price_view to p4_xxxxx.
call slpm_alter_view_owner('ads.customer_total_order_price_view', 'p4_xxxxx');
Nonaktifkan fitur tampilan lintas-skema
-- Disable cross-schema view support.
call slpm_disable_multi_schema_view();
-- Transfer all view ownership back to the developer group of each view's schema.
call slpm_migrate();
Setelah menjalankan perintah-perintah ini, tampilan non-lintas-skema yang sudah ada tetap dapat ditanyakan dan SLPM berperilaku normal. Tampilan lintas-skema tidak lagi dapat ditanyakan.
Langkah selanjutnya
-
SLPM functions — referensi lengkap untuk semua fungsi SLPM termasuk detail parameter
-
User groups and permissions in SLPM — referensi cepat untuk izin masing-masing kelompok pengguna