ฉันจะบังคับใช้การเขียนครั้งเดียวจากนั้นอ่านตารางฐานข้อมูลเท่านั้นใน SQL ได้อย่างไร


28

เป็นไปได้ไหม

กรณีการใช้งานของฉันคือตารางบัญชีแยกประเภทที่มีข้อกำหนดว่าเมื่อสร้างเรกคอร์ดแล้วควรเป็นแบบอ่านอย่างเดียวนั่นคือไม่มีใครสามารถแก้ไขหรือลบได้ นี้ใช้กับตารางบัญชีแยกประเภทและตารางที่มีความสัมพันธ์โดยตรงกับมัน - มีตารางอื่น ๆ ในสคีมาเดียวกันซึ่งจะมีการปรับปรุง / ลบตามปกติ

ความเข้าใจของฉันคือเพื่อความสมบูรณ์ของข้อมูลข้อ จำกัด เหล่านี้ควรนำไปใช้กับเลเยอร์ฐานข้อมูล แต่ฉันไม่สามารถหาวิธีที่สะอาดและเป็นที่ยอมรับในการทำสิ่งนี้ได้ - นี่เป็นกรณีการใช้งานที่ฉันควรจะทำได้ดีกว่า ในชั้นสมัครหรือไม่

อุดมคติจะเป็นวิธีที่จะทำใน SQL ธรรมดาเพื่อให้ไม่เชื่อในสิ่งที่ใช้แพลตฟอร์ม DB เนื่องจากอาจมีการเปลี่ยนแปลง แต่ฉันรู้ว่าอาจจะมากเกินไปที่จะขอดังนั้นถ้ามันมี จะขึ้นอยู่กับแพลตฟอร์มต้องการรสชาติของ MySQL บางอย่าง

ขอขอบคุณ!

คำตอบ:


43

ฉันเห็นอย่างน้อยสองวิธีในการบรรลุเป้าหมายนี้ วิธีแรกคือการไม่ให้สิทธิ์DELETEและUPDATEสิทธิพิเศษในตารางแบบเขียนครั้งเดียวหรือสำหรับสิทธิ์นั้นนอกเหนือจากINSERTและSELECTเพื่อให้ผู้ใช้สามารถแทรกหรือเลือกได้

อีกตัวเลือกหนึ่งคือการกำหนดBEFORE UPDATEและBEFORE DELETEเรียกใช้ในตารางเหล่านี้และใช้SIGNALคำสั่งเพื่อเพิ่มข้อยกเว้นในเนื้อหาของทริกเกอร์ซึ่งจะป้องกันการอัปเดตและลบตามลำดับ


6
ฉันขอแนะนำตัวเลือกทั้งสองเนื่องจากคุณทำให้ความตั้งใจของคุณชัดเจนและทำให้ต้องทำหลายอย่างโดยเจตนาเพื่อละเมิดมัน
Adam Martin

3
ทริกเกอร์เป็นตัวเลือกที่ดีกว่าเนื่องจากใช้งานธุรกรรมทั้งหมดรวมถึงรายการที่ดำเนินการโดยผู้ใช้ที่เป็นผู้ดูแลระบบและสามารถให้ข้อความแสดงข้อผิดพลาดเฉพาะเจาะจงมากขึ้น
Blrfl

10

สิทธิ์ดูเหมือนจะเป็นทางเลือกที่เห็นได้ชัด - แต่คุณยังสามารถใช้จัดเก็บที่เก็บเครื่องยนต์ เอ็นจิ้นตารางนี้ออกแบบมาเพื่อบันทึกข้อมูลจำนวนมากที่จะไม่เปลี่ยนแปลง:

เอ็นจิน ARCHIVE สนับสนุน INSERT, REPLACE, และ SELECT แต่ไม่ใช่ DELETE หรือ UPDATE มันสนับสนุนการดำเนินการตามคำสั่งคอลัมน์ BLOB และโดยทั่วไปทั้งหมดยกเว้นประเภทข้อมูลเชิงพื้นที่ (ดูส่วนที่ 11.5.1“ ประเภทข้อมูลเชิงพื้นที่”) เอนจิน ARCHIVE ใช้การล็อกระดับแถว

ความแตกต่างของการอนุญาตคือคนที่มีสิทธิ์เพิ่มเติมจะยังสามารถเปลี่ยนข้อมูลในประเภทตารางอื่น ๆ ได้ส่วนใหญ่ในขณะที่ ARCHIVE ไม่อนุญาตให้ใครก็ตามแก้ไขข้อมูลที่มีอยู่ในตารางแล้ว


1
จากที่นี่ดูเหมือนว่าREPLACEจะเป็นประเภทUPDATE! "REPLACE ทำงานเหมือนกับ INSERT ยกเว้นว่าถ้าแถวเก่าในตารางมีค่าเหมือนกับแถวใหม่สำหรับคีย์หลักหรือดัชนี UNIQUE แถวเก่าจะถูกลบก่อนที่จะแทรกแถวใหม่ดูส่วนที่ 13.2.5 ,“ INSERT Syntax”. "
Vérace

7

ดูที่ " สถาปัตยกรรมแบบจุดในเวลา " หรือ " สถาปัตยกรรมฐานข้อมูลชั่วคราว "

การออกแบบฐานข้อมูล: จุดในสถาปัตยกรรมเวลา

ในการใช้ฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่ คำสั่งอัพเดตและลบจะทำลายข้อมูลที่เคยมีมาก่อนปัญหาของพวกเขา อย่างไรก็ตามบางระบบต้องการว่าจะไม่มีข้อมูลใดถูกลบหรืออัพเดทในฐานข้อมูล ในบทความนี้ Arthur Fuller นำเสนอวิธีการแก้ปัญหาความต้องการนี้ในรูปแบบของสถาปัตยกรรมแบบ Point-in-Time: การออกแบบฐานข้อมูลที่ช่วยให้ผู้ใช้สามารถสร้างภาพของฐานข้อมูลตามที่มีอยู่ ณ จุดใด ๆ ก่อนหน้านี้โดยไม่ทำลาย ภาพปัจจุบัน

ฐานข้อมูลชั่วคราว

จากวิกิพีเดีย
ฐานข้อมูลสารานุกรมชั่วคราวที่เก็บข้อมูลเกี่ยวกับอินสแตนซ์ของเวลา มันมีประเภทข้อมูลทางโลกและเก็บข้อมูลที่เกี่ยวข้องกับเวลาในอดีตปัจจุบันและอนาคต

แนวคิดพื้นฐานของทั้งสองคือคุณต้องเพิ่มข้อมูลโดยไม่ลบหรือเก็บข้อมูลในลักษณะที่คุณสามารถดึงข้อมูลตามที่มีอยู่ในปัจจุบัน ... หรือมีอยู่ในช่วงเวลาก่อนหน้า

คำถามที่เกี่ยวข้องที่นี่: วิธีการสร้าง-a-จุดในเวลาสถาปัตยกรรมใน MySQL ,

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.