Bagaimana cara menegakkan menulis-sekali lalu hanya membaca tabel database di SQL?

28

Apakah itu mungkin?

Kasus penggunaan saya adalah tabel buku besar, dengan persyaratan bahwa setelah catatan dibuat, itu harus hanya-baca, yaitu tidak ada yang harus dapat mengedit atau menghapusnya. Ini hanya berlaku untuk tabel buku besar dan tabel dengan hubungan langsung dengannya - ada tabel lain dalam skema yang sama yang akan diperbarui / dihapus seperti biasa.

Pemahaman saya adalah bahwa untuk keperluan integritas data, kendala semacam ini harus diterapkan pada lapisan basis data, tetapi saya tidak dapat menemukan cara yang bersih dan diterima secara luas untuk melakukan ini - apakah ini kasus penggunaan di mana saya lebih baik melakukannya di lapisan aplikasi?

Yang ideal akan menjadi cara untuk melakukannya dalam SQL biasa, sehingga menjadi agnostik dari apa platform DB digunakan, karena itu dapat berubah, tapi saya menyadari bahwa mungkin terlalu banyak bertanya, jadi jika memiliki untuk menjadi tergantung pada platform, beberapa rasa MySQL lebih disukai.

Terima kasih!

altanqa
sumber

Jawaban:

43

Saya melihat setidaknya dua cara untuk mencapai ini. Pendekatan pertama adalah untuk tidak memberikan DELETEdan UPDATEhak istimewa pada tabel menulis sekali ini, atau, dalam hal ini, setiap hak istimewa terpisah dari INSERTdan SELECT, dengan demikian hanya memungkinkan pengguna untuk memasukkan atau memilih dari mereka.

Opsi lain adalah menentukan BEFORE UPDATEdan BEFORE DELETEmemicu pada tabel ini dan menggunakan SIGNALpernyataan untuk memunculkan pengecualian di tubuh pemicu, yang akan mencegah pembaruan dan menghapus masing-masing.

mustaccio
sumber
6
Saya akan merekomendasikan kedua opsi karena Anda membuat niat Anda jelas dan membuat harus mengambil beberapa tindakan yang disengaja untuk melanggarnya
Adam Martin
3
Pemicu adalah pilihan yang lebih baik karena memicu semua transaksi, termasuk yang dilakukan oleh pengguna administratif, dan dapat memberikan pesan kesalahan yang lebih spesifik.
Blrfl
10

Izin tampaknya menjadi pilihan yang jelas - namun Anda juga bisa menggunakan Mesin Penyimpanan ARCHIVE . Mesin tabel ini dirancang untuk merekam sejumlah besar data yang tidak akan berubah:

Mesin ARCHIVE mendukung INSERT, REPLACE, dan SELECT, tetapi tidak DELETE atau UPDATE. Itu mendukung ORDER DENGAN operasi, kolom BLOB, dan pada dasarnya semua kecuali tipe data spasial (lihat Bagian 11.5.1, “Tipe Data Spasial”). Mesin ARCHIVE menggunakan penguncian tingkat baris.

Perbedaannya dengan izin adalah bahwa seseorang dengan hak istimewa yang diperluas masih akan dapat mengubah data pada sebagian besar jenis tabel lainnya, sementara ARCHIVE tidak mengizinkan siapa pun untuk mengubah data yang sudah ada di dalam tabel.

iMemiliki komputer
sumber
1
Dari sini , sepertinya itu REPLACEsemacam UPDATE! "REPLACE bekerja persis seperti INSERT, kecuali jika baris lama dalam tabel memiliki nilai yang sama dengan baris baru untuk KUNCI UTAMA atau indeks UNIK, baris lama dihapus sebelum baris baru dimasukkan. Lihat Bagian 13.2.5 , "INSERT Syntax". "
Vérace
7

Lihat ke " Arsitektur Arsitektur Titik Waktu " atau " Arsitektur Database Temporal "

Desain Basis Data: Titik Arsitektur Waktu

Dalam kebanyakan implementasi basis data relasional. Perbarui dan Hapus perintah menghancurkan data yang ada di sana sebelum masalah mereka. Namun, beberapa sistem mengharuskan tidak ada informasi yang pernah dihapus secara fisik dari atau diperbarui dalam database. Dalam artikel ini, Arthur Fuller menyajikan solusi untuk persyaratan ini dalam bentuk arsitektur Point-in-Time: desain basis data yang memungkinkan pengguna untuk membuat ulang gambar dari basis data seperti yang ada pada titik waktu sebelumnya, tanpa merusak gambar saat ini.

Database temporal

Dari Wikipedia,
basis data Temporal basis data gratis menyimpan data yang berkaitan dengan instance waktu. Ini menawarkan tipe data temporal dan menyimpan informasi yang berkaitan dengan masa lalu, sekarang dan masa depan.

Ide dasar keduanya adalah bahwa Anda perlu menambahkan data tanpa menghapus - atau menyimpan data sedemikian rupa sehingga Anda dapat menarik data seperti yang ada saat ini ... atau ada pada waktu sebelumnya.

pertanyaan terkait di sini: bagaimana-membuat-titik-dalam-waktu-arsitektur-di-mysql ,

WernerCD
sumber