1.创建测试表、视图
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE AUDIT_HIS(
EMP_ID INT NOT NULL,
EMP_NAME TEXT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
EMP_NAME TEXT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
CREATE OR REPLACE VIEW "public"."company_view" AS
SELECT company.id,company.name,company.age
FROM company;
2.创建触发器函数
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO AUDIT_HIS(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (OLD.ID,OLD.NAME,current_timestamp);
INSERT INTO AUDIT(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (NEW.ID,NEW.NAME,current_timestamp);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
注:
a.触发器函数是触发器触发时调用,函数返回的类型必须是TRIGGER ,且不能有任何参数
b.postgresql触发器函数中自带一些特殊变量:
- NEW:数据类型是record,在insert、update操作触发时存储新的数据行
- OLD:数据类型是record,在update、delete操作触发时存储旧的数据行
- TG_OP:内容为“INSERT”,“UPDATE”,“DELETE”,“TRUNCATE”,用于指定DML语句类型
- TG_TABLE_NAME:触发器所在表的表名称 TG_SCHEMA_NAME:触发器所在表的模式
3.创建触发器
3.1表触发器
CREATE TRIGGER example_trigger AFTER INSERT OR UPDATE ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
3.2视图触发器
CREATE TRIGGER company_view_trigger AFTER UPDATE ON company_view
EXECUTE PROCEDURE auditlogfunc();
注:视图触发器不支持行级,即 不能添加FOR EACH ROW
4.删除触发器
DROP TRIGGER example_trigger on COMPANY;
5.删除函数
drop function function_name (parameters_list);
6.查看所有触发器
SELECT * FROM pg_trigger;
7.测试
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
UPDATE COMPANY SET NAME ='阿里巴巴' WHERE ID ='1';