天天看點

mysql資料庫和postgreSql資料庫行級觸發器常用操作

在各個資料庫中我們經常會對資料進行備份操作,可以借助觸發器來實作

emp為資料操作表

emp_audit了解為資料備份表

mysql行級别觸發器(mysql非常簡單):

建立表emp:
CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);
建立表emp_audit:
CREATE TABLE emp_audit(
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary integer
);
-- 建立emp新增資料時候的觸發器,把插入的這條新資料備份到emp_audit表
CREATE  TRIGGER `insert_tigger` AFTER INSERT ON `emp` FOR EACH ROW BEGIN
  INSERT INTO emp_audit SELECT 'INSERT', now(), USER(), new.empname,new.salary;
 END;
-- 建立emp更新資料時候的觸發器,把修改的這條新資料備份到emp_audit表
CREATE  TRIGGER `update_tigger` AFTER UPDATE ON `emp` FOR EACH ROW BEGIN
  INSERT INTO emp_audit SELECT 'update', now(), USER(), new.empname,new.salary;
 END;
-- 建立emp删除資料時候的觸發器,把删除的哪條老資料備份到emp_audit表
CREATE  TRIGGER `del_tigger` AFTER DELETE ON `emp` FOR EACH ROW BEGIN
  INSERT INTO emp_audit SELECT 'del', now(), USER(), OLD.empname,OLD.salary;
 END;
           

postgresql行級别觸發器(稍微需要多寫點了,借助FUNCTION函數來進行):

建立表emp:
CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);
建立表emp_audit:
CREATE TABLE emp_audit(
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary integer
);
建立為觸發器執行的函數:
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
    BEGIN
        -- 在emp_audit中建立一行以反映在emp上執行的操作,
        -- 使用特殊的變量TG_OP來計算這個操作.
        IF (TG_OP = 'DELETE') THEN --emp表執行删除操作時候,把删除的這條資料放到emp_audit表(OLD.*表示舊資料,NEW.*表示新資料)
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN --emp表執行修改操作時候,把修改的這條新資料放到emp_audit表
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN --emp表執行插入操作時候,把插入的的這條新資料放到emp_audit表
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$emp_audit$ LANGUAGE plpgsql;

為表emp添加觸發器,然後執行的函數
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp --在emp_audit表每一行操作之後,執行增删查改是觸發
    FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();--執行的函數