Làm cách nào để tôi thực thi ghi một lần rồi chỉ đọc bảng cơ sở dữ liệu trong SQL?


28

Nó thậm chí có thể?

Trường hợp sử dụng của tôi là một bảng sổ cái, với một yêu cầu là một khi bản ghi được tạo, nó phải ở chế độ chỉ đọc, tức là không ai có thể chỉnh sửa hoặc xóa nó. Điều này chỉ áp dụng cho bảng sổ cái và các bảng có quan hệ trực tiếp với nó - có các bảng khác trong cùng một lược đồ sẽ được cập nhật / xóa như bình thường.

Hiểu biết của tôi là vì mục đích toàn vẹn dữ liệu, các loại ràng buộc này nên được áp dụng ở lớp cơ sở dữ liệu, nhưng tôi không thể tìm thấy một cách rõ ràng, được chấp nhận rộng rãi để làm điều này - đây có phải là trường hợp sử dụng tốt hơn không? trong lớp ứng dụng?

Lý tưởng sẽ là một cách để làm điều đó trong SQL đơn giản, vì vậy không thể biết được nền tảng DB được sử dụng là gì, vì điều đó có thể thay đổi, nhưng tôi nhận ra rằng có thể có quá nhiều yêu cầu, vì vậy nếu nó có phụ thuộc vào nền tảng, một số hương vị của MySQL được ưa thích.

Cảm ơn bạn!

Câu trả lời:


43

Tôi thấy ít nhất hai cách để thực hiện điều này. Cách tiếp cận đầu tiên là không cấp DELETEvà các UPDATEđặc quyền trên các bảng ghi một lần này, hoặc, đối với vấn đề đó, bất kỳ đặc quyền nào ngoài INSERTSELECTdo đó chỉ cho phép người dùng chèn vào hoặc chọn từ chúng.

Một tùy chọn khác là xác định BEFORE UPDATEBEFORE DELETEkích hoạt trên các bảng này và sử dụng SIGNALcâu lệnh để đưa ra một ngoại lệ trong phần thân kích hoạt, điều này sẽ ngăn các cập nhật và xóa tương ứng.


6
Tôi muốn đề xuất cả hai tùy chọn vì bạn đã làm rõ ý định của mình và phải thực hiện nhiều hành động có chủ ý để vi phạm nó
Adam Martin

3
Kích hoạt là một lựa chọn tốt hơn vì chúng kích hoạt tất cả các giao dịch, bao gồm cả các giao dịch được thực hiện bởi người dùng quản trị và có thể đưa ra thông báo lỗi cụ thể hơn.
Blrfl

10

Quyền dường như là sự lựa chọn rõ ràng - tuy nhiên bạn cũng có thể sử dụng Công cụ lưu trữ ARCHIVE . Công cụ bảng này được thiết kế để ghi lại lượng lớn dữ liệu sẽ không thay đổi:

Công cụ ARCHIVE hỗ trợ XÁC NHẬN, THAY THẾ và CHỌN, nhưng không XÓA hoặc CẬP NHẬT. Nó hỗ trợ các thao tác ORDER BY, các cột BLOB và về cơ bản là tất cả các loại dữ liệu không gian (xem Phần 11.5.1, Các kiểu dữ liệu không gian của Hồi giáo). Động cơ ARCHIVE sử dụng khóa cấp hàng.

Sự khác biệt về quyền là ai đó có đặc quyền mở rộng vẫn có thể thay đổi dữ liệu trên hầu hết các loại bảng khác, trong khi ARCHIVE không cho phép bất kỳ ai thay đổi dữ liệu đã có trong bảng.


1
Từ đây , có vẻ như REPLACElà một loại UPDATE! "REPLACE hoạt động chính xác như INSERT, ngoại trừ nếu một hàng cũ trong bảng có cùng giá trị với một hàng mới cho KEY PRIMARY hoặc chỉ mục UNIQUE, hàng cũ sẽ bị xóa trước khi hàng mới được chèn. Xem Phần 13.2.5 , CỨU CHỨNG MINH Cú pháp. "
Vérace

7

Nhìn vào " Kiến trúc điểm trong thời gian " hoặc " Kiến trúc cơ sở dữ liệu tạm thời "

Thiết kế cơ sở dữ liệu: Một điểm trong kiến ​​trúc thời gian

Trong hầu hết các triển khai cơ sở dữ liệu quan hệ. Các lệnh Cập nhật và Xóa hủy dữ liệu đã có trước khi xảy ra sự cố. Tuy nhiên, một số hệ thống yêu cầu không có thông tin nào bị xóa hoặc cập nhật trong cơ sở dữ liệu. Trong bài viết này, Arthur Fuller trình bày một giải pháp cho yêu cầu này dưới dạng kiến ​​trúc Thời gian: thiết kế cơ sở dữ liệu cho phép người dùng tạo lại hình ảnh của cơ sở dữ liệu như đã tồn tại tại bất kỳ thời điểm nào trước đó mà không phá hủy hình ảnh hiện tại.

Cơ sở dữ liệu tạm thời

Từ Wikipedia,
cơ sở dữ liệu bách khoa toàn thư miễn phí lưu trữ dữ liệu liên quan đến các trường hợp thời gian. Nó cung cấp các loại dữ liệu tạm thời và lưu trữ thông tin liên quan đến thời gian trong quá khứ, hiện tại và tương lai.

Ý tưởng cơ bản của cả hai là bạn cần thêm dữ liệu mà không cần xóa - hoặc lưu trữ dữ liệu theo cách bạn có thể kéo dữ liệu như hiện tại ... hoặc tồn tại ở thời điểm trước đó.

câu hỏi liên quan ở đây: how-to-created-a-point-in-time-architecture-in-mysql ,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.