1

最初に、アプリケーションにはadminsandemployeesとがありrecordsます。

レコード テーブルには、どの従業員も変更できないほど多くの列があります。ただし、この変更は提出できません。管理者が編集を承認すると、レコードがシステムに再び表示されます。

列名と値を識別し、UPDATE のトリガーを使用して別のテーブルに送信しようとしていました。

そのため、従業員がレコードを編集すると、そのレコードはシステムで無効になります。また、管理者はどの値が変更されたかを知ることができます。

これはデータベースで可能ですか?

Records Table
-------------------------------------------------------------------
record_id       record_name     record_serial       record_active
-------------------------------------------------------------------
    1            something          5151                 YES

5151 から 9844 など、record_serial に更新が発生した場合、これを行う必要があります。

Records_changes
-------------------------------------------------------------------
change_id          record_col       record_old_val      record_new_val
-------------------------------------------------------------------
    1            record_serial          5151                 9844

同時に

-------------------------------------------------------------------
record_id       record_name     record_serial       record_active
-------------------------------------------------------------------
    1            something          9844                 NO

私は自分のアプリケーションを使用してそれを行うことができますが、とにかくデータベースを使用してそれを行うことができれば、はるかに優れています.

これを使用して変更を追跡し、レコードの古い値の履歴も作成します。

私は使っているMySQL

4

2 に答える 2

1

このようなことができます

DELIMITER $$
CREATE TRIGGER tg_bu_records
BEFORE UPDATE ON records
FOR EACH ROW
BEGIN
  IF NOT (OLD.record_serial <=> NEW.record_serial AND
          OLD.record_name <=> NEW.record_name) THEN
    SET NEW.record_active = 0;
  END IF;
END$$

CREATE TRIGGER tg_au_records
AFTER UPDATE ON records
FOR EACH ROW
BEGIN
  IF NOT (OLD.record_serial <=> NEW.record_serial) THEN
    INSERT INTO records_changes (record_col, record_old_val, record_new_val)
    VALUES ('record_serial', OLD.record_serial, NEW.record_serial);
  END IF;
  IF NOT (OLD.record_name <=> NEW.record_name) THEN
    INSERT INTO records_changes (record_col, record_old_val, record_new_val)
    VALUES ('record_name', OLD.record_name, NEW.record_name);
  END IF;
END$$
DELIMITER ;

注:トリックは、トリガーを定義したテーブルで更新/挿入されている行の値を変更できる唯一のイベントであるため、トリガーのrecord_activeフラグを変更することです。トリガーでは、行われた変更を記録しますBEFOREAFTER

これがSQLFiddleのデモです

于 2013-09-28T03:10:42.093 に答える