Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Подскажите, а есть ли какой-нибудь способ заблокировать запись базы без дальнейшей ее возможности изменения.
Скажем я выдал товар с ID=3. И теперь мне надо, чтобы эту запись нельзя было бы изменить, в случае, если кто-то найдет дыру.
Неактивен
Покурите пользовательские блокировки
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, они работают по принципу mutex'ов.
Ну и тяжелые уровни изоляции транзакций, возможно, помогут.
А саму Вашу задачу опишите подробнее? Вы хотите заблокировать от других потоков того же исполняемого кода или же?..
Неактивен
Насколько я понял, речь про то, чтобы сделать какой-то write-only механизм (в смысле — нужна не блокировка, а постоянная неизменяемость).
Я вижу два способа разной степени костыльности:
1. Различные таблички.
Делаем две таблички с одинаковой структурой, при этом выдаем права на одну из них только на insert. Над ними делаем VIEW для чтения объединенных данных. Тогда перенесение из второй таблички в первую сделает так, что прав на изменение не будет.
Условно:
CREATE TABLE immutable (a INT);
CREATE TABLE mutable (a INT);
CREATE VIEW access SQL SECURITY INVOKER AS SELECT * FROM immutable UNION SELECT * FROM mutable;
GRANT SELECT, INSERT, UPDATE, DELETE ON dbname.mutable TO username@host;
GRANT SELECT, INSERT ON dbname.immutable TO username@host;
-- работаем с access, делаем immutable вот так:
INSERT INTO immutable SELECT * FROM mutable WHERE a = xxx;
DELETE FROM mutable WHERE a = xxx;
2. Триггеры.
Делаем дополнительное поле неизменяемости и триггер, который проверяет значение этого поля и запрещает изменение.
CREATE TABLE foo (a int, immutable TINYINT DEFAULT 0);
DELIMITER ;;
CREATE TRIGGER bu_foo BEFORE UPDATE ON foo FOR EACH ROW IF OLD.immutable != 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The row is immutable'; END IF;;
CREATE TRIGGER bd_foo BEFORE DELETE ON foo FOR EACH ROW IF OLD.immutable != 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The row is immutable'; END IF;;
DELIMITER ;
Неактивен
Спасибо. Большое
Неактивен