Jak wymusić tabelę bazy danych tylko do odczytu, a następnie tylko do odczytu w SQL?

28

Czy to w ogóle możliwe?

Mój przypadek użycia to tabela księgi, z warunkiem, że po utworzeniu rekordu powinien on być tylko do odczytu, tzn. Nikt nie powinien mieć możliwości jego edycji ani usuwania. Dotyczy to tylko tabeli księgi i tabel z bezpośrednią relacją do niej - istnieją inne tabele w tym samym schemacie, które zostaną zaktualizowane / usunięte normalnie.

Rozumiem, że do celów integralności danych tego rodzaju ograniczenia powinny być stosowane w warstwie bazy danych, ale nie mogę znaleźć czystego, powszechnie akceptowanego sposobu na zrobienie tego - czy jest to przypadek użycia, w którym lepiej bym to zrobił w warstwie aplikacji?

Idealny byłby sposób na zrobienie tego w zwykłym SQL, aby być niezależnym od tego, która platforma DB jest używana, ponieważ może to ulec zmianie, ale zdaję sobie sprawę, że może to być zbyt wiele, więc jeśli ma aby być zależnym od platformy, preferowany jest pewien smak MySQL.

Dziękuję Ci!

altanqa
źródło

Odpowiedzi:

43

Widzę co najmniej dwa sposoby na osiągnięcie tego. Pierwszym podejściem jest nieprzyznawanie DELETEi UPDATEprzywilejów w tych tabelach jednokrotnego zapisu lub, w tym przypadku, żadnych przywilejów oprócz, INSERTa SELECTtym samym pozwalanie użytkownikom tylko na wstawianie lub wybieranie z nich.

Inną opcją jest zdefiniowanie BEFORE UPDATEi BEFORE DELETEwyzwalanie tych tabel oraz użycie SIGNALinstrukcji do zgłoszenia wyjątku w treści wyzwalacza, który odpowiednio zapobiegałby aktualizacjom i usuwaniu.

mustaccio
źródło
6
Poleciłbym obie opcje, ponieważ wyjaśnisz swój zamiar i podejmiesz wiele świadomych działań, aby je złamać
Adam Martin
3
Wyzwalacze są lepszym wyborem, ponieważ uruchamiają wszystkie transakcje, w tym transakcje podejmowane przez użytkowników administracyjnych, i mogą dawać bardziej szczegółowy komunikat o błędzie.
Blrfl
10

Wydaje się, że uprawnienia są oczywistym wyborem - można jednak również użyć ARCHIVE Storage Engine . Ten silnik tabel został zaprojektowany do rejestrowania dużych ilości danych, które nie ulegną zmianie:

Silnik ARCHIWUM obsługuje WSTAWANIE, WYMIANA i WYBIERZ, ale nie USUŃ ani AKTUALIZUJ. Obsługuje operacje ORDER BY, kolumny BLOB i zasadniczo wszystkie typy danych oprócz przestrzennych (patrz Rozdział 11.5.1, „Typy danych przestrzennych”). Silnik ARCHIVE wykorzystuje blokadę na poziomie wiersza.

Różnica w stosunku do uprawnień polega na tym, że osoba z rozszerzonymi uprawnieniami nadal będzie mogła zmieniać dane w większości innych typów tabel, podczas gdy ARCHIWUM nie pozwala nikomu zmieniać danych, które już znajdują się w tabeli.

mam komputer
źródło
1
Od tutaj wydaje się, że REPLACEjest to swego rodzaju UPDATE! „WYMIANA działa dokładnie tak, jak WSTAW, z wyjątkiem tego, że jeśli stary wiersz w tabeli ma taką samą wartość jak nowy wiersz dla KLUCZA PODSTAWOWEGO lub indeksu UNIKALNEGO, stary wiersz jest usuwany przed wstawieniem nowego wiersza. Patrz rozdział 13.2.5 , „INSERT Składnia”. ”
Vérace
7

Zajrzyj do „ Architektura punktu w czasie ” lub „ Architektura bazy danych czasowych

Projektowanie baz danych: architektura punktu w czasie

W większości implementacji relacyjnych baz danych. Polecenia Aktualizuj i Usuń niszczą dane, które były tam przed ich wydaniem. Jednak niektóre systemy wymagają, aby żadne informacje nie były fizycznie usuwane ani aktualizowane w bazie danych. W tym artykule Arthur Fuller przedstawia rozwiązanie tego wymagania w postaci architektury Point-in-Time: projekt bazy danych, który pozwala użytkownikowi odtworzyć obraz bazy danych istniejącej w dowolnym momencie, bez niszczenia bieżący obraz.

Baza danych czasowych

Z Wikipedii, darmowa encyklopedia
Baza danych Temporal przechowuje dane dotyczące instancji czasu. Oferuje typy danych czasowych i przechowuje informacje dotyczące przeszłości, teraźniejszości i przyszłości.

Podstawową ideą obu jest to, że albo musisz dodać dane bez usuwania - albo przechowywać dane w taki sposób, abyś mógł pobrać dane takie, jakie istnieją obecnie ... lub istniały w poprzednim czasie.

powiązane pytanie tutaj: how-to-create-a-point-in-time-architecture-in-mysql ,

WernerCD
źródło