Come imposto una tabella di sola lettura quindi sola lettura in SQL?


28

È anche possibile?

Il mio caso d'uso è una tabella di contabilità, con il requisito che una volta creato un record, dovrebbe essere di sola lettura, ovvero nessuno dovrebbe essere in grado di modificarlo o eliminarlo. Questo vale solo per la tabella contabile e le tabelle con una relazione diretta con essa - ci sono altre tabelle nello stesso schema che verranno aggiornate / eliminate normalmente.

La mia comprensione è che ai fini dell'integrità dei dati questi tipi di vincoli dovrebbero essere applicati a livello di database, ma non riesco a trovare un modo pulito e ampiamente accettato di farlo - è un caso d'uso in cui farei meglio a farlo nel livello dell'applicazione?

L'ideale sarebbe un modo per farlo in semplice SQL, in modo da essere agnostici rispetto alla piattaforma DB utilizzata, poiché potrebbe essere soggetta a modifiche, ma mi rendo conto che potrebbe essere troppo da chiedere, quindi se ha per essere dipendenti dalla piattaforma, si preferisce un certo sapore di MySQL.

Grazie!

Risposte:


43

Vedo almeno due modi per ottenere questo risultato. Il primo approccio è quello di non concedere DELETEe UPDATEprivilegi su queste tabelle write-once o, in tal caso, eventuali privilegi a parte INSERTe SELECT, consentendo così agli utenti solo di inserirli o selezionarli.

Un'altra opzione è quella di definire BEFORE UPDATEe BEFORE DELETEtrigger su queste tabelle e utilizzare l' SIGNAListruzione per sollevare un'eccezione nel corpo del trigger, che impedirebbe rispettivamente gli aggiornamenti e le eliminazioni.


6
Consiglierei entrambe le opzioni poiché chiarisci la tua intenzione e fai un do do di intraprendere più azioni deliberate per violarlo
Adam Martin,

3
I trigger sono una scelta migliore poiché si attivano su tutte le transazioni, comprese quelle intraprese dagli utenti amministrativi, e possono fornire un messaggio di errore più specifico.
Blrfl,

10

Le autorizzazioni sembrano essere la scelta ovvia, tuttavia è possibile utilizzare anche ARCHIVE Storage Engine . Questo motore di tabella è progettato per registrare grandi quantità di dati che non cambieranno:

Il motore ARCHIVE supporta INSERT, REPLACE e SELECT, ma non DELETE o UPDATE. Supporta le operazioni ORDER BY, le colonne BLOB e praticamente tutti i tipi di dati tranne quelli spaziali (vedere Sezione 11.5.1, "Tipi di dati spaziali"). Il motore ARCHIVE utilizza il blocco a livello di riga.

La differenza rispetto alle autorizzazioni è che qualcuno con privilegi estesi sarebbe ancora in grado di modificare i dati sulla maggior parte degli altri tipi di tabella, mentre ARCHIVE non consente a nessuno di modificare i dati già presenti nella tabella.


1
Da qui , sembra che REPLACEsia una specie di UPDATE! "REPLACE funziona esattamente come INSERT, tranne per il fatto che se una vecchia riga nella tabella ha lo stesso valore di una nuova riga per un PRIMARY KEY o un indice UNIQUE, la vecchia riga viene eliminata prima dell'inserimento della nuova riga. Vedere la Sezione 13.2.5 , "INSERT Sintassi". "
Vérace,

7

Cerca in " Point in Time Architecture " o " Temporal Database Architecture "

Progettazione di database: un'architettura point in time

Nella maggior parte delle implementazioni di database relazionali. I comandi Aggiorna ed Elimina distruggono i dati presenti prima del loro problema. Tuttavia, alcuni sistemi richiedono che nessuna informazione venga mai cancellata fisicamente o aggiornata nel database. In questo articolo, Arthur Fuller presenta una soluzione a questo requisito sotto forma di architettura Point-in-Time: una progettazione di database che consente a un utente di ricreare un'immagine del database così com'era in qualsiasi momento precedente, senza distruggere l'immagine corrente.

Database temporale

Da Wikipedia, l'enciclopedia libera
Temporal database memorizza i dati relativi alle istanze temporali. Offre tipi di dati temporali e memorizza informazioni relative al tempo passato, presente e futuro.

L'idea di base di entrambi è che è necessario aggiungere dati senza eliminare o archiviare i dati in modo tale da poter estrarre i dati così come sono attualmente ... o esistere in un datetime precedente.

domanda correlata qui: come-creare-un-punto-nel-tempo-architettura-in-mysql ,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.