Ditulis oleh Giuseppe Broccolo
Sejak PostgreSQL 9.3, dimungkinkan untuk memperbarui dan menyisipkan ke dalam tampilan secara langsung, selama tampilan tersebut hanya merujuk pada satu tabel yang mendasarinya.
PostgreSQL 9.4 memungkinkan kita menggunakan klausa CHECK untuk INSERT ke dalam tampilan yang dapat diperbarui. Misalnya, pertimbangkan tabel yang hanya terdiri dari satu kolom bilangan bulat; dan pertimbangkan dua tampilan, satu pada angka yang habis dibagi 2 dan satu pada angka yang habis dibagi 3. Jika kita mencoba memasukkan angka 123 ke tampilan pertama:
—-
$ CREATE TABLE some_data(id int4 PRIMARY KEY);
BUAT TABEL
$ CREATE VIEW dulu SEBAGAI PILIH * FROM some_data WHERE 0 =id%2;
BUAT LIHAT
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;
BUAT LIHAT
$ INSERT INTO first(id) VALUES (123);
—-
Itu akan dimasukkan ke dalam tabel yang mendasarinya, meskipun tampilannya hanya untuk angka yang habis dibagi 2 (sehingga nilai baru tidak akan terlihat dalam tampilan). Di PostgreSQL 9.4 klausa CHECK telah diperkenalkan untuk mengelola INSERT dengan benar ke dalam tampilan dengan memeriksa terlebih dahulu apakah nilainya kompatibel dengan definisi tampilan.
Ada dua opsi yang memungkinkan:
* CASCADED CHECK – ini adalah opsi default, di mana pemeriksaan kaskade ke tampilan lain yang ditentukan pada tabel dasar yang sama
* PERIKSA LOKAL – hanya tampilan yang menjadi target INSERT yang dicentang
Di sini ditunjukkan cara menggunakan klausa CHECK pada contoh di atas:
—-
$ DROP VIEW dulu;
LEPASKAN TAMPILAN
$ JAUHKAN LIHAT detik;
LEPASKAN TAMPILAN
$ CREATE VIEW dulu AS SELECT * FROM some_data WHERE 0 =id % 2 WITH CHECK OPTION;
BUAT LIHAT
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id % 3 WITH CHECK OPTION;
BUAT LIHAT
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH CHECK OPTION;
BUAT LIHAT
$ INSERT INTO first(id) VALUES (14);
MASUKKAN 0 1
$ INSERT INTO first(id) VALUES (15);
KESALAHAN: baris baru melanggar DENGAN OPSI PERIKSA untuk tampilan “pertama”
$ INSERT INTO detik(id) NILAI (15);
MASUKKAN 0 1
$ INSERT INTO ketiga(id) NILAI (6);
MASUKKAN 0 1
$ INSERT INTO ketiga(id) NILAI (15);
KESALAHAN: baris baru melanggar DENGAN OPSI PERIKSA untuk tampilan “pertama”
Perhatikan bahwa tampilan "ketiga" didefinisikan pada tampilan "pertama".
Nilai '14' dimasukkan dengan benar pada tampilan pertama, sedangkan nilai '15' hanya dapat dimasukkan ke detik, bukan pertama – seperti yang diharapkan. Kita dapat menyisipkan '6' ke tampilan ketiga karena habis dibagi 3 dan 2. Kesalahan memasukkan '15' ke tampilan ketiga meskipun habis dibagi 3 adalah karena melanggar klausa CHECK yang bisa dibagi-2 pada tampilan induk, pertama. Dalam hal ini, tidak cukup menggunakan klausa LOCAL CHECK di kedua tampilan untuk mengatasi masalah:
—-
$ DROP VIEW dulu;
LEPASKAN TAMPILAN
$ DROP VIEW ketiga;
LEPASKAN TAMPILAN
$ CREATE VIEW dulu AS SELECT * FROM some_data WHERE 0 =id % 2 WITH LOCAL CHECK OPTION;
BUAT LIHAT
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH LOCAL CHECK OPTION;
BUAT LIHAT
$ INSERT INTO ketiga(id) NILAI (15);
KESALAHAN: baris baru melanggar DENGAN OPSI PERIKSA untuk tampilan “pertama”
—-
Contoh kerja ditunjukkan di sini:
—-
$ DROP VIEW dulu;
LEPASKAN TAMPILAN
$ DROP VIEW ketiga;
LEPASKAN TAMPILAN
$ CREATE VIEW dulu SEBAGAI PILIH * FROM some_data WHERE 0 =id % 2;
BUAT LIHAT
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH LOCAL CHECK OPTION;
BUAT LIHAT
$ INSERT INTO ketiga(id) NILAI (15);
MASUKKAN 0 1
—-
Kesimpulan
Mekanisme pemeriksaan baru ini dapat diterapkan langsung pada tampilan yang dapat diperbarui selama fase INSERT. Ini semakin memperkuat peran database dalam menjaga integritas data.