場景:當 users 表在 insert,update,delete 時,在 users_log 表中記錄變更的 id
MySQL觸發器的創建
觸發時機:BEFORE,AFTER
觸發事件:INSERT,UPDATE,DELETE
NEW 和 OLD 關鍵字:
| action | NEW | OLD |
|--------|----------------|----------------|
| insert | 插入的新數據 | 無 |
| update | 修改為的新數據 | 被修改的原數據 |
| delete | 無 | 被刪除的原數據 |
DELIMITER $
CREATE TRIGGER insert_user AFTER INSERT
ON users FOR EACH ROW
BEGIN
INSERT INTO users_log(user_id, action) VALUES(NEW.id, 'insert');
END$
DELIMITER ;
SQL Server觸發器的創建
觸發時機:INSTEAD OF(之前),FOR(之後)
觸發事件:INSERT,UPDATE,DELETE
INSERTED 和 DELETED 邏輯(概念)表:作用相當於 MySQL 中的 NEW 和 OLD 關鍵字,不過 MySQL 的代表一條記錄,而 SQL Server 的代表所有記錄的臨時表
CREATE TRIGGER insert_user ON users FOR INSERT AS
BEGIN
DECLARE @id INT
SELECT @id = MIN(id) FROM INSERTED WHILE @id IS NOT NULL
BEGIN
INSERT INTO users_log(user_id, action) VALUES (@id, 'insert')
SELECT @id = MIN(id) FROM INSERTED WHERE id > @id
END
END
Oracle觸發器的創建
觸發時機:BEFORE,AFTER
觸發事件:INSERT,UPDATE,DELETE
:NEW 和 :OLD 關鍵字:作用相當於 MySQL 中的 NEW 和 OLD 關鍵字
CREATE OR REPLACE TRIGGER insert_user AFTER INSERT
ON SCOTT."users" FOR EACH ROW
BEGIN
insert into SCOTT."users_log"("user_id", "action") VALUES (:NEW."id", 'insert');
END;
/