鑑於此架構:
CREATE TABLE contacts (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL
)
我會創建此架構,以及:
CREATE TABLE contacts_audit (
`id` INT(10) UNSIGNED NOT NULL,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`action` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci'
)
然後使用這些觸發器(希望我的觸發語法是不是太生疏):
CREATE TRIGGER contacts_audit_insert
AFTER INSERT
ON users FOR EACH ROW
BEGIN
INSERT INTO contacts_audit (id, first_name, last_name, updated_by, updated_at, action) values (NEW.id, NEW.first_name, NEW.last_name, NEW.updated_by, NEW.updated_at, 'insert');
END;
CREATE TRIGGER contacts_audit_update
AFTER UPDATE
ON users FOR EACH ROW
BEGIN
INSERT INTO contacts_audit (id, first_name, last_name, updated_by, updated_at, action) values (NEW.id, NEW.first_name, NEW.last_name, NEW.updated_by, NEW.updated_at, 'update');
END;
CREATE TRIGGER contacts_audit_delete
BEFORE DELETE
ON users FOR EACH ROW
BEGIN
INSERT INTO contacts_audit (id, first_name, last_name, updated_by, updated_at, action) values (OLD.id, OLD.first_name, OLD.last_name, OLD.updated_by, OLD.updated_at, 'delete');
END;
個
潛在的缺點
如果你正在使用一個MySQL的用戶名/密碼數據庫訪問和驗證用戶對MySQL中的users
表,則在執行任何刪除之前,你將要進行更新,在PHP中,然後刪除,以便您可以捕獲誰刪除了您的記錄。
但是,如果你正在使用MySQL爲所有用戶的身份驗證,那麼你可以在你的觸發器有這樣的:以通知使用USER()
INSERT INTO contacts_audit (id, first_name, last_name, updated_by, updated_at, action) values (NEW.id, NEW.first_name, NEW.last_name, USER(), NEW.updated_at, 'insert');
這個問題是非常題外話,因爲它是非常廣泛,可能以意見爲基礎,但觸發是要走的路。因爲它處於數據庫級別,所以更快,更可靠。無論如何,我可能會提供答案,因爲這可能很難正確實施。 – MonkeyZeus
這個問題如何成爲他自己話題的話題?也許這是一個數據庫級別,但這並不意味着MySQL會更快地做到這一點:/您沒有閱讀我的第二個問題 –