Bir kez yazmayı nasıl zorlar ve ardından SQL'de yalnızca veritabanı tablosunu okurum?


28

Mümkün mü?

Kullanım durumum, bir kayıt oluşturulduktan sonra salt okunur olması gerektiği, yani hiç kimsenin onu düzenleyememesi veya silmemesi gerektiği şartı olan bir defter masasıdır. Bu, yalnızca defter ve masa ile doğrudan ilişkili olan tablolar için geçerlidir - aynı şemada normal olarak güncellenecek / silinecek başka tablolar da vardır.

Anladığım kadarıyla veri bütünlüğü amacıyla bu tür kısıtlamaların veritabanı katmanında uygulanması gerektiği, ancak bunu yapmanın temiz ve yaygın olarak kabul görmüş bir yolunu bulamıyorum. uygulama katmanında?

İdeal olan şey, düz SQL'de yapmanın bir yolu olabilir, bu yüzden hangi DB platformunun kullanıldığının farkında olmadığından değişebilir. Ancak, bunun için isteyecek çok fazla şey olabileceğinin farkındayım. platforma bağımlı olması için, MySQL'in bir lezzeti tercih edilir.

Teşekkür ederim!

Yanıtlar:


43

Bunu başarmanın en az iki yolunu görüyorum. İlk yaklaşım, bir kez yazılan bu tablolara ayrıcalıklar vermemek DELETEve UPDATEayrıcalıkları vermemek , veya bu konuda, ayrıcalıkları INSERTve dışındaki ayrıcalıkları SELECTvermemektir, bu nedenle yalnızca kullanıcıların içine eklemelerini veya seçmelerini sağlamaktır.

Diğer bir seçenek de bu tabloları tanımlamak BEFORE UPDATEve BEFORE DELETEtetiklemektir ve SIGNALifadeyi, tetikleyicide sırayla güncellemeleri ve silmeleri önleyen bir istisna oluşturmak için kullanmaktır .


6
Her iki seçeneği de öneririm, çünkü niyetinizi açıklığa kavuşturur ve bunu ihlal etmek için çok sayıda kasıtlı eylemde bulunmak zorunda kalırsınız
Adam Martin

3
Tetikleyiciler, idari kullanıcılar tarafından üstlenilenler de dahil olmak üzere tüm işlemlere ateş açtıkları için daha iyi bir seçimdir ve daha spesifik bir hata mesajı verebilir.
Blrfl

10

İzinler açık bir seçim gibi görünüyor - ancak ARCHIVE Storage Engine'i de kullanabilirsiniz . Bu tablo motoru, değişmeyecek büyük miktarda veri kaydetmek için tasarlanmıştır:

ARŞİV motoru, INSERT, REPLACE ve SELECT'i destekler, ancak DELETE veya UPDATE özelliğini desteklemez. SİPARİŞ BY işlemlerini, BLOB sütunlarını ve temel olarak tüm ama uzamsal veri türlerini destekler (bkz. Bölüm 11.5.1, “Mekansal Veri Tipleri”). ARCHIVE motoru sıra düzeyinde kilitleme kullanıyor.

İzinlerdeki fark, genişletilmiş ayrıcalıklara sahip olan birinin, diğer birçok tablo türündeki verileri değiştirmeye devam etmesi, ARCHIVE'ın ise zaten tabloda bulunan verileri değiştirmesine izin vermemesidir.


1
Gönderen burada , şunlar anlaşılmaktadır REPLACEbir çeşit UPDATE! "REPLACE tam olarak INSERT gibi çalışır, ancak eğer tablodaki eski bir satır bir PRIMARY KEY veya UNIQUE endeksi için yeni bir satır ile aynı değere sahipse, yeni satır eklenmeden önce eski satır silinir. Bkz. Bölüm 13.2.5 , “INSERT Sözdizimi”. "
Vérace

7

" Zaman Mimarisinde Gösterme " veya " Geçici Veritabanı Mimarisi " konusuna bakın

Veritabanı Tasarımı: Zaman Mimarisinde Bir Nokta

En ilişkisel veritabanı uygulamalarında. Güncelle ve Sil komutları, yayınlanmadan önce orada bulunan verileri yok eder. Bununla birlikte, bazı sistemler hiçbir bilginin veritabanında fiziksel olarak silinmemesini veya güncellenmemesini gerektirir. Bu makalede, Arthur Fuller, bu gereksinime bir Zamanın Noktası mimarisi biçiminde bir çözüm sunmaktadır: bir kullanıcının, herhangi bir zamanda herhangi bir zamanda var olan veritabanının görüntüsünü imha etmeden yeniden yaratmasına olanak sağlayan bir veritabanı tasarımı Geçerli görüntü

Geçici veritabanı

Vikipedi, özgür ansiklopedi
Temporal veritabanı zaman örnekleri ile ilgili verileri saklar. Geçici veri türleri sunar ve geçmiş, şimdi ve gelecek zamanla ilgili bilgileri depolar.

Her ikisinin de temel fikirleri, silmeden veri eklemek zorunda olmanız veya verileri şu anda olduğu gibi alabilecek ... veya önceki bir tarihte var olacak şekilde saklamanız gerektiğidir.

Burada ilgili soru: nasıl mysql-in-bir-zaman-zaman-mimarisi-mimarisi-oluşturmak ,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.