これはビジネスロジックである可能性が高く、おそらくデータストレージレイヤーに属していません。ただし、それでもトリガー を使用して実行できます。 。
BEFORE UPDATE
を作成できます 「ロックされた」レコードが更新されようとしている場合にエラーを発生させるトリガー。エラーが前に発生するため 操作が実行されると、MySQLはそれを続行しなくなります。レコードが削除されないようにする場合も、同様のトリガーを作成する必要がありますBEFORE DELETE
。
レコードが「ロック」されているかどうかを判断するには、ブール値のlocked
を作成します。 列:
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 ...;
SIGNAL
に注意してください
MySQL5.5で導入されました。以前のバージョンでは、MySQLでエラーが発生する原因となる誤ったアクションを実行する必要があります。私はしばしば存在しないプロシージャを呼び出します。 CALL raise_error;
を使用
繰り返しますが、絶対に必要な場合 このロジックをストレージレイヤーに配置し、PK以外の方法でロックされたレコードを識別できないようにします。 テストをトリガーにハードコーディングします。たとえば、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 ;
しかし、これは絶対に恐ろしい そして私はほとんど何でもします 可能な限りそれを避けるために。