sql >> データベース >  >> RDS >> Mysql

MySQLの行を読み取り専用に設定するにはどうすればよいですか?

    これはビジネスロジックである可能性が高く、おそらくデータストレージレイヤーに属していません。ただし、それでもトリガー を使用して実行できます。 。

    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 ;
    

    しかし、これは絶対に恐ろしい そして私はほとんど何でもします 可能な限りそれを避けるために。




    1. MySQLでJSON配列を検索する方法は?

    2. ホテルの部屋予約システムのデータモデルの設計

    3. データベース内のすべてのテーブルをUTF8文字セットに変更するにはどうすればよいですか?

    4. PostgreSQLで監視する重要事項-ワークロードの分析