Developing DB change logs - ita-social-projects/WhatBackend GitHub Wiki

Necessary steps

  1. Decide which table should have change logs.
  2. Make sure there is a column in this table, such as UpdatedByAccountId, to display who made the most recent changes. If not you should add it.
  3. If you have added this column for logging, then you should implement this functionality in code.

The following steps must be performed in a separate script for logs to make logging optional.

  1. Create table for change logs (for example AccountsChanges for table Accounts). This table should contain columns "old" and "new" for all values that can be changed.
CREATE TABLE `AccountsChanges` (
    `ID`                        BIGINT UNSIGNED     NOT NULL         AUTO_INCREMENT,
    `AccountID`                 BIGINT UNSIGNED     NOT NULL,
    `OldRole`                   TINYINT UNSIGNED    DEFAULT NULL,
    `NewRole`                   TINYINT UNSIGNED    DEFAULT NULL,
    `OldFirstName`              VARCHAR(30)         DEFAULT NULL,
    `NewFirstName`              VARCHAR(30)         DEFAULT NULL,
    `OldLastName`               VARCHAR(30)         DEFAULT NULL,
    `NewLastName`               VARCHAR(30)         DEFAULT NULL,
    `OldEmail`                  VARCHAR(50)         DEFAULT NULL,
    `NewEmail`                  VARCHAR(50)         DEFAULT NULL,
    `OldPasswordHash`           VARCHAR(64)         DEFAULT NULL,
    `NewPasswordHash`           VARCHAR(64)         DEFAULT NULL,
    `OldSalt`                   VARCHAR(32)         DEFAULT NULL,
    `NewSalt`                   VARCHAR(32)         DEFAULT NULL,
    `OldIsActive`               BIT                 DEFAULT NULL,
    `NewIsActive`               BIT                 DEFAULT NULL,
    `OldForgotPasswordToken`    VARCHAR(36)         DEFAULT NULL,
    `NewForgotPasswordToken`    VARCHAR(36)         DEFAULT NULL,
    `OldForgotTokenGenDate`     DATETIME            DEFAULT NULL,
    `NewForgotTokenGenDate`     DATETIME            DEFAULT NULL,
    `OldAvatarID`               BIGINT UNSIGNED     DEFAULT NULL,
    `NewAvatarID`               BIGINT UNSIGNED     DEFAULT NULL,
    `QueriedBy`                 BIGINT UNSIGNED     NOT NULL,
    `DateTime`                  DATETIME     	    DEFAULT NOW(),
    
    CONSTRAINT    `PK_AccountsChanges`         PRIMARY KEY (`ID`)
);
  1. Create necessary sql triggers (after insert/update/delete).
DELIMITER $$

CREATE TRIGGER `AfterAccountsUpdate`
AFTER UPDATE
ON `Accounts` FOR EACH ROW
BEGIN
	INSERT INTO `AccountsChanges`
    (`AccountID`, `OldRole`, `NewRole`, `OldFirstName`, `NewFirstName`, `OldLastName`, `NewLastName`, `OldEmail`, `NewEmail`, `OldPasswordHash`, `NewPasswordHash`, `OldSalt`, `NewSalt`, `OldIsActive`, `NewIsActive`, `OldForgotPasswordToken`, `NewForgotPasswordToken`,
    `OldForgotTokenGenDate`, `NewForgotTokenGenDate`, `OldAvatarID`, `NewAvatarID`, `QueriedBy`)
    VALUES
    (NEW.`ID`, OLD.`Role`, NEW.`Role`, OLD.`FirstName`, NEW.`FirstName`, OLD.`LastName`, NEW.`LastName`, OLD.`Email`, NEW.`Email`, OLD.`PasswordHash`, NEW.`PasswordHash`, OLD.`Salt`, NEW.`Salt`, OLD.`IsActive`, NEW.`IsActive`, OLD.`ForgotPasswordToken`, NEW.`ForgotPasswordToken`, 
    OLD.`ForgotTokenGenDate`, NEW.`ForgotTokenGenDate`, OLD.`AvatarID`, NEW.`AvatarID`, NEW.`UpdatedByAccountId`)
    ;
END$$

DELIMITER ;
  1. Сheck that the application works correctly both with enabled and disabled logs.