All Products
Search
Document Center

AnalyticDB:Manajemen izin menggunakan tampilan

Last Updated:Mar 29, 2026

Tampilan memungkinkan Anda mengekspos subset terfilter dari sebuah tabel ke akun tertentu tanpa memberikan akses langsung ke tabel dasarnya. Hal ini menjadikan tampilan sebagai mekanisme efektif untuk kontrol akses tingkat baris: setiap akun hanya dapat melakukan kueri terhadap tampilan yang memiliki izin, dan AnalyticDB for MySQL menerapkan filter yang didefinisikan dalam tampilan tersebut.

Cara kerja

Saat Anda membuat tampilan dengan SQL SECURITY DEFINER, tampilan tersebut dijalankan dengan izin dari pembuatnya (definer), bukan akun yang melakukan kueri. Artinya:

  • Akun yang diberikan izin SELECT pada suatu tampilan dapat melakukan kueri tanpa memerlukan izin apa pun pada tabel dasarnya.

  • AnalyticDB for MySQL secara otomatis menerapkan klausa WHERE dari tampilan tersebut, sehingga akun hanya melihat baris-baris yang diekspos oleh tampilan.

Dengan demikian, Anda dapat mengisolasi data antar akun dengan membuat satu tampilan untuk setiap partisi data dan memberikan akses masing-masing akun hanya ke tampilan yang sesuai.

Skenario

Tabel customer menyimpan catatan pelanggan dari beberapa provinsi. Tujuannya adalah memberikan akses kepada user1 hanya ke catatan Provinsi 1 (province_id=1) dan user2 hanya ke catatan Provinsi 2 (province_id=2).

Definisi tabel:

CREATE TABLE `customer` (
  `id`          bigint AUTO_INCREMENT,
  `province_id` bigint NOT NULL,
  `user_info`   varchar,
  PRIMARY KEY (`id`)
) DISTRIBUTED BY HASH(`id`);

Data uji:

INSERT INTO customer (province_id, user_info)
VALUES (1, 'Tom'), (1, 'Jerry'), (2, 'Jerry'), (3, 'Mark');

Tabel lengkap berisi empat baris dari tiga provinsi:

+---------------------+-------------+-----------+
| id                  | province_id | user_info |
+---------------------+-------------+-----------+
| 1369417242420617216 |           1 | Tom       |
| 1369417242424811520 |           1 | Jerry     |
| 1369417242424811522 |           3 | Mark      |
| 1369417242424811521 |           2 | Jerry     |
+---------------------+-------------+-----------+

Siapkan kontrol akses berbasis tampilan

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster AnalyticDB for MySQL dengan database adb_demo

  • Hak istimewa admin untuk membuat tampilan dan memberikan izin

  • Akun user1 dan user2 yang sudah dibuat (lihat CREATE USER)

Langkah 1: Buat tampilan untuk setiap provinsi

Buat satu tampilan untuk setiap provinsi. Setiap tampilan memfilter tabel customer berdasarkan nilai province_id tertentu. Klausul SQL SECURITY DEFINER memastikan tampilan dijalankan dengan izin pembuatnya, sehingga akun yang melakukan kueri tidak memerlukan akses langsung ke tabel customer.

-- Tampilan untuk Provinsi 1: hanya mengekspos baris dengan province_id = 1
CREATE SQL SECURITY DEFINER VIEW v1 AS
  SELECT * FROM customer WHERE province_id = 1;

-- Tampilan untuk Provinsi 2: hanya mengekspos baris dengan province_id = 2
CREATE SQL SECURITY DEFINER VIEW v2 AS
  SELECT * FROM customer WHERE province_id = 2;

Untuk sintaksis dan parameter lengkap CREATE VIEW, lihat CREATE VIEW.

Langkah 2: Berikan setiap akun akses ke tampilannya masing-masing

Berikan izin SELECT pada tampilan, bukan pada tabel dasarnya. Dengan cara ini, setiap akun hanya dapat membaca baris yang diekspos oleh tampilan yang ditugaskan, sedangkan tabel dasar customer tetap tidak dapat diakses oleh kedua akun tersebut.

-- user1 dapat melakukan kueri pada v1 (hanya data Provinsi 1).
-- Memberikan izin pada tampilan, bukan pada customer, mencegah user1 mengakses provinsi lain.
GRANT SELECT ON v1 TO user1;

-- user2 dapat melakukan kueri pada v2 (hanya data Provinsi 2).
-- Memberikan izin pada tampilan, bukan pada customer, mencegah user2 mengakses provinsi lain.
GRANT SELECT ON v2 TO user2;

Verifikasi hasil

Lakukan koneksi ke database adb_demo sebagai masing-masing akun dan jalankan kueri SELECT pada tampilan yang ditugaskan. Contoh berikut menunjukkan kueri yang diizinkan dan kueri yang ditolak untuk setiap akun.

Sebagai user1:

-- user1 memiliki SELECT pada v1. Kueri ini hanya mengembalikan baris Provinsi 1.
SELECT * FROM v1;
+---------------------+-------------+-----------+
| ID                  | PROVINCE_ID | USER_INFO |
+---------------------+-------------+-----------+
| 1369417242420617216 |           1 | Tom       |
| 1369417242424811520 |           1 | Jerry     |
+---------------------+-------------+-----------+
-- user1 tidak memiliki izin pada v2. Kueri ini ditolak.
SELECT * FROM v2;
ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denied

Sebagai user2:

-- user2 memiliki SELECT pada v2. Kueri ini hanya mengembalikan baris Provinsi 2.
SELECT * FROM v2;
+---------------------+-------------+-----------+
| ID                  | PROVINCE_ID | USER_INFO |
+---------------------+-------------+-----------+
| 1369417242424811521 |           2 | Jerry     |
+---------------------+-------------+-----------+
-- user2 tidak memiliki izin pada v1. Kueri ini ditolak.
SELECT * FROM v1;
ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denied

Langkah selanjutnya

  • Terapkan pola ini ke provinsi tambahan dengan membuat satu tampilan untuk setiap nilai province_id dan memberikan izin SELECT pada tampilan tersebut kepada akun yang sesuai.

  • Untuk mencabut akses, jalankan REVOKE SELECT ON <view_name> FROM <account_name>.

  • Untuk referensi lengkap opsi pembuatan tampilan, lihat CREATE VIEW.