Tampilan adalah tabel virtual yang dihasilkan dari kueri terhadap satu atau lebih tabel tetapi tidak menyimpan data aktual. Tampilan dapat menyederhanakan kueri kompleks dan meningkatkan keamanan data. Topik ini menjelaskan cara menggunakan pernyataan CREATE VIEW untuk membuat tampilan.
Catatan Penggunaan
Kompatibilitas tampilan antara AnalyticDB for MySQL dan MySQL:
Versi sebelum 3.1.9.0
AnalyticDB for MySQL tidak kompatibel dengan perilaku default MySQL. Jika kolom ditambahkan ke atau dihapus dari tampilan, sistem mendeteksi perubahan jumlah kolom dalam respons pernyataan
SELECT * FROM <view_name>;, menentukan bahwa tampilan tersebut tidak valid, lalu melaporkan kesalahan berikut:Tampilan '<view_name>' sudah usang; harus dibuat ulang.Versi 3.1.9.0 dan yang lebih baru
AnalyticDB for MySQL kompatibel dengan perilaku default MySQL. Saat menggunakan pernyataan CREATE VIEW untuk membuat tampilan, AnalyticDB for MySQL menyimpan pernyataan setelah mem-parsing asterisk (
*) dalam pernyataan menjadi kolom tertentu. Dalam hal ini, tidak ada kesalahan yang terjadi saat Anda menambahkan atau menghapus kolom.
Untuk memastikan kompatibilitas dengan perilaku default MySQL, disarankan menggunakan kluster AnalyticDB for MySQL versi 3.1.9.0 atau yang lebih baru untuk membuat tampilan. Ini mencegah masalah tak terduga yang disebabkan oleh asterisk (*), seperti semantik ambigu dan kesalahan.
Kompatibilitas kluster AnalyticDB for MySQL versi 3.1.9.0 atau yang lebih baru dengan perilaku MySQL dapat menyebabkan dampak khusus. Misalnya, ketika Anda mengubah nama Kolom C menjadi Kolom D, sistem gagal menemukan Kolom C saat merujuk Kolom A, Kolom B, dan Kolom C, lalu melaporkan kesalahan. Ini adalah hasil yang diharapkan karena tahap parsing di mana pemeriksaan sintaksis SQL dan otentikasi dilakukan lebih awal daripada tahap optimisasi di mana kolom dihapus. Sistem melaporkan kesalahan pada tahap parsing tanpa memandang apakah Kolom C digunakan untuk kueri. Di AnalyticDB for MySQL versi sebelum 3.1.9.0, sistem hanya memeriksa apakah jumlah kolom dalam tampilan sama dengan jumlah kolom yang dirujuk oleh asterisk (*). Dalam hal ini, tidak ada kesalahan yang dilaporkan, dan sistem memetakan Kolom C ke kolom ketiga tabel dasar. Saat Anda mengkueri Kolom C setelah operasi RENAME, tidak ada kesalahan yang dilaporkan. Ini adalah hasil yang tidak diharapkan.
Jika bisnis Anda memiliki persyaratan untuk kompatibilitas dengan perilaku khusus kluster AnalyticDB for MySQL versi sebelum 3.1.9.0, Anda dapat menambahkan petunjuk ke pernyataan CREATE VIEW atau mengonfigurasi parameter global tertentu.
Tambahkan petunjuk berikut ke pernyataan CREATE VIEW untuk satu tampilan:
/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/. Contoh pernyataan:/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ CREATE VIEW v0 AS SELECT * FROM base0;Konfigurasikan parameter global berikut untuk menerapkan pengaturan yang diperlukan untuk semua tampilan:
SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;.
Sintaks
CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;Opsi | Diperlukan | Deskripsi |
| Tidak | Membuat tampilan berdasarkan apakah tampilan yang ada menggunakan nama yang sama. Aturan berikut berlaku:
Catatan Jika opsi ini tidak ditentukan, tidak ada tampilan yang dapat dibuat saat tampilan yang ada menggunakan nama yang sama. |
| Menentukan metode untuk otentikasi keamanan saat data dikueri dari tampilan. Nilai valid:
Catatan
| |
| Ya | Nama tampilan. Catatan Saat menamai tampilan, Anda juga dapat menambahkan nama database yang berisi tampilan sebelum nama tampilan. Contoh: |
| Sumber data tampilan. |
Contoh
Persiapkan Data
Lakukan operasi berikut menggunakan akun istimewa kluster AnalyticDB for MySQL:
Buat akun bernama
user1.CREATE USER user1 IDENTIFIED BY 'user1_pwd';Buat tabel bernama
t1di database yang ada bernamaadb_demo.Create Table `t1` ( `id` bigint AUTO_INCREMENT, `id_province` bigint NOT NULL, `user_info` varchar, primary key (`id`) ) DISTRIBUTED BY HASH(`id`);Masukkan data uji ke dalam tabel
t1.INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
Buat Tampilan
CatatanContoh berikut menunjukkan cara menentukan metode otentikasi yang berbeda saat Anda membuat tampilan. Data dalam tampilan berasal dari tabel
t1.Buat tampilan bernama
v1denganSQL SECURITYdiatur keINVOKER.CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;Buat tampilan bernama
v2denganSQL SECURITYdiatur keDEFINER.CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;Buat tampilan bernama
v3tanpa menentukan opsiSQL SECURITY. Dalam hal ini, metode otentikasiINVOKERdigunakan.CREATE VIEW v3 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
Bandingkan Izin
Gunakan akun istimewa untuk memberikan akun
user1izin untuk mengkueri tiga tampilan.GRANT SELECT ON adb_demo.v1 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v2 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';Dalam hal ini, setelah Anda menggunakan akun
user1untuk terhubung ke databaseadb_demokluster AnalyticDB for MySQL, Anda dapat menggunakan akunuser1untuk mengkueri data hanya dari tampilanv2.SELECT * FROM v2;Hasil berikut dikembalikan:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+Saat Anda mengkueri data dari tampilan
v1atauv3menggunakan pernyataan SELECT, kesalahan dikembalikan.SELECT * FROM v1;atau
SELECT * FROM v3;Pesan kesalahan berikut dikembalikan saat Anda mengeksekusi salah satu pernyataan SELECT di atas:
ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Gagal menganalisis tampilan yang disimpanSetelah akun
user1diberikan izin untuk mengkueri tiga tampilan, gunakan akun istimewa untuk memberikan akunuser1izin untuk mengkueri tabelt1.GRANT SELECT ON adb_demo.t1 to user1@'%';Dalam hal ini, setelah Anda menggunakan akun
user1untuk terhubung ke databaseadb_demokluster AnalyticDB for MySQL, Anda dapat menggunakan akunuser1untuk mengkueri data dari tampilanv1,v2, danv3.SELECT * FROM v1;atau
SELECT * FROM v2;atau
SELECT * FROM v3;Hasil berikut dikembalikan saat Anda mengeksekusi salah satu pernyataan SELECT di atas:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
FAQ
Nama kolom diatur dalam huruf kecil di tabel dasar. Mengapa nama kolom ditampilkan dalam huruf besar di set hasil tampilan?
Secara default, nama kolom dalam set hasil tampilan AnalyticDB for MySQL tidak peka huruf besar-kecil. Jika Anda lebih memilih untuk menampilkan nama kolom dalam huruf kecil di set hasil tampilan, Anda dapat mengeksekusi pernyataan berikut untuk mengatur parameter VIEW_OUTPUT_NAME_CASE_SENSITIVE menjadi true:
SET ADB_CONFIG VIEW_OUTPUT_NAME_CASE_SENSITIVE=true;Praktik Terbaik
Untuk informasi lebih lanjut, lihat Manajemen izin menggunakan tampilan.