Veritabanı girişlerinin (verilerin) sürümlendirilmesine izin vermenin yolları nelerdir?
Makale değişikliklerini geri alabilmek için içerik yönetim sistemlerinin yeteneklerini düşünün.
Artıları / eksileri nelerdir?
Veritabanı girişlerinin (verilerin) sürümlendirilmesine izin vermenin yolları nelerdir?
Makale değişikliklerini geri alabilmek için içerik yönetim sistemlerinin yeteneklerini düşünün.
Artıları / eksileri nelerdir?
Yanıtlar:
Temel olarak iki yaklaşım vardır: içinde önceki tüm değerlerin saklandığı bir denetim tablosu veya tablonun bir parçası olarak bir başlangıç / bitiş tarihi içerir ve tüm güncellemeler eskisini kapatırken yeni bir kayıt oluşturur.
Güncelleme: SQL SERVER 2016 bunu bir tasarım deseni / tablo türü olarak desteklemektedir - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
Bir fikir "Yalnızca Eklenen Veritabanları" kullanmaktır. Temel fikir, bir satırdaki verileri asla silmemeniz veya güncellememenizdir .
İzlenecek gereklidir Her tablo iki sahip olacak datetime
sütunlar from
ve to
. NULL
Her birindeki değerle başlarlar (zamanın başlangıcından sonuna kadar). Satırı "değiştirmeniz" gerektiğinde, yeni bir satır eklersiniz ve aynı zamanda bir to
önceki satıra Now
ve from
eklediğiniz satıra da güncellersiniz Now
.
Daha ayrıntılı bilgi için şuraya bakın:
Bu teknik, AuditTrail
eski verileri yönetmek için çağrılır ve tür depoları değişiklik geçmişini saklar.
Bu doğanın sorusu zaten yayınlanmış gibi görünüyor:
Her tablo için tetikleyicileri kullanabileceğinizi ve _history'deki verileri koruyabileceğinizi düşünüyorum (veya herhangi bir ad verebilirsiniz) ve her ekleme, güncelleme, ana tablodaki silme tetikleyicinizi tetikler ve bu tablodaki ayrıntıları kaydedebilirsiniz. SQLite veritabanıyla da kullanılabilir.
Bu mekanizma büyük projeler için de yararlıdır. Bu tabloda, değişiklikleri yapan kullanıcının bilgilerini, değişikliklerin zaman damgasıyla birlikte günlüğe kaydedebilirsiniz. daha sonra tablonuzu gereksinimlerinize uygun zaman damgası herhangi birine geri yükleyebilirsiniz.
Her Veritabanının tetikleyicileri yazmak ve kodlamak için kendi yolu vardır. SQLite kullanıyorsanız sözdizimi için SQLite.org adresini ziyaret edin . Diğer veritabanları için resmi sitelerini ziyaret edebilirsiniz.
Muhtemelen Sqlite db motorunun farkındasınızdır . Tüm db tek bir dosyaya kaydedilir. Api ayrıca sanal dosya sistemlerini de destekler, böylece depolamayı her yerde ve herhangi bir formatta düzenleyebilirsiniz, sadece belirli dosya ofsetlerindeki okuma ve yazma işlemlerine yanıt verin. Bunun için olası uygulamalar şifreleme, sıkıştırma vb. Olabilir. Kapsayıcı katmanının veritabanları, sql veya sqlite dosya biçimi hakkında hiçbir şey bilmemesi gereken en iyi yanı, sadece xRead ve xWrite geri çağrılarına uymaktır.
Fikirlerden biri zaman makinesi özelliğini uygulamaktı. Bu nedenle, herhangi bir xWrite işlemi, "geri al" geçmişinde üzerine yazacağı her segmenti kaydeder ve kullanıcı db'nin içerdiği şeyi (muhtemelen salt okunur mod) görmek için geçmişte bir tarih seçebilir. Henüz çalışma örneğim yok ( sqlite posta listesinde bu konuda bir tartışma vardı ), ancak muhtemelen diğer motorlar VFS API'leri sağlayarak benzer bir şey mümkün. Ve bir kez uygulandığında, herhangi bir karmaşıklığın veritabanı yapılarıyla uyumlu olmalıdır.
Veritabanı girişlerini sürümlemek için kullandığımız yöntem bir denetim tablosu kullanmaktır. Tablo, aşağıdaki satırlarda bir şemaya sahiptir:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
Ardından, izlemek istediğimiz tabloları Ekle / Güncelle / Sil ile ilgili tetikleyicilerimiz var.
Artıları:
Eksileri:
Şimdi bunun bir versiyonunu yapıyorum. her kayıt için bir Ekleme Tarihi, Değiştirme tarihi ve Aktif Kayıt boole bayrağı var. İlk ekleme için Eklenen ve Değiştirilen tarihlerin her ikisi de Şimdi () (Bu örnek Access'te) ve Etkin kayıt bayrağı olarak ayarlanır true
. bu kaydı değiştirirsem her şeyi yeni bir kayda kopyalar, kullanıcının değiştirdiği alanları değiştiririm, Ekleme tarihini orijinaline eşit olarak değiştiririm ve Değiştirme tarihini Şimdi () olarak değiştiririm. Daha sonra orijinal kaydın Aktif Kayıt bayrağını false
ve yeni kaydın üzerine çeviririm true
. Ayrıca orijinal kaydın kimliğini kaydetmek ModifiedRecordsParentID için bir alan var.
Sonra bile sorgulamak ActiveRecord = true
gerekirse ben sadece nerede kayıtları iade edebilir ve ben sadece en güncel bilgi alacak.
ActiveRecord
Bayrağa gerek yok . MAX (*) satırı her zaman geçerli kayıt olmalıdır. Önceki bir sürüme geri yükleme, söz konusu satırı tekrar tabloya ekler.
select top 1 order by id descending
.
Ayrıca, zaman içinde DB'deki TÜM değişiklikleri saklamak istiyorsanız, günlüğe kaydetmeyi kontrol etmek isteyebilirsiniz ( /programming/3394132/where-can-i-find-the-mysql-transaction-log )