Necessary steps
- Decide which table should have change logs.
- 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.
- 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.
- 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`)
);
- 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 ;
- Сheck that the application works correctly both with enabled and disabled logs.