Pertanyaan Bagaimana mengatur baris MySQL untuk BACA-SAJA?


Saya memiliki baris di meja yang saya tidak ingin diubah (pernah).

Apakah mungkin untuk mengatur baris MySQL untuk MEMBACA-HANYA sehingga tidak dapat diperbarui dengan cara apa pun? Jika ya, bagaimana caranya?

Jika tidak, apakah mungkin untuk menetapkan nilai permanen di salah satu kolom dari baris itu sehingga tidak dapat diubah? Jika ya, bagaimana caranya?

Terima kasih.


32
2018-05-08 16:09


asal


Jawaban:


Ini mungkin logika bisnis, yang mungkin tidak termasuk dalam lapisan penyimpanan data Anda. Namun, itu tetap dapat dicapai dengan menggunakan pemicu.

Anda dapat membuat BEFORE UPDATE pemicu yang menimbulkan kesalahan jika catatan "terkunci" akan diperbarui; karena kesalahan terjadi sebelum operasi dilakukan, MySQL berhenti untuk melanjutkannya. Jika Anda juga ingin mencegah rekaman dihapus, Anda harus membuat pemicu yang sama BEFORE DELETE.

Untuk menentukan apakah suatu catatan "dikunci", Anda bisa membuat boolean locked kolom:

ALTER TABLE my_table ADD COLUMN locked BOOLEAN NOT NULL DEFAULT FALSE;

DELIMITER ;;

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.locked THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.locked THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;

DELIMITER ;

UPDATE my_table SET locked = TRUE WHERE ...;

Perhatikan itu SIGNAL diperkenalkan di MySQL 5.5. Di versi sebelumnya, Anda harus melakukan beberapa tindakan yang salah yang menyebabkan MySQL menimbulkan kesalahan: Saya sering menyebut prosedur yang tidak ada, mis. dengan CALL raise_error;


Saya tidak dapat membuat kolom tambahan di tabel ini, tetapi baris memiliki id unik di salah satu kolom, jadi bagaimana saya melakukan ini untuk skenario itu?

Sekali lagi, jika Anda pasti harus tempatkan logika ini di lapisan penyimpanan — dan tidak dapat mengidentifikasi catatan yang dikunci dengan cara apa pun selain PK — Anda bisa kode-keras tes ke pemicu Anda; misalnya, untuk "mengunci" catatan dengan id_column = 1234:

DELIMITER ;;

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;

DELIMITER ;

Tapi ini adalah benar-benar mengerikan dan saya akan melakukannya hampir semuanya untuk menghindarinya sebisa mungkin.


36
2018-05-08 16:12