postgresql的pl语言比较特殊,以下脚本在pgadmin执行成功,而在一些其他的数据库工具往往会报错
存储过程
create or replace function meheco_org_stmp()
returns trigger as $$
begin
NEW.ts := date_trunc('second', now());
RETURN NEW;
end;
$$
language plpgsql;
date_trunc('second', now());这句将now()获得的时间戳削减精度到了秒。可根据需求酌情选择精度。
#触发器
CREATE TRIGGER meheco_org_stmp BEFORE INSERT OR UPDATE ON meheco_org
FOR EACH ROW EXECUTE PROCEDURE meheco_org_stmp();
#更新语句
update meheco_org set name = 'testzhu' where id=6666 and ts= '2016-11-25 16:39:04'
通过触发器在每次新增或更新表的一行时执行存储过程,该过程刷新了条目的ts字段,在更新时检查这一字段如果ts值不等于先前拿到的值,则说明在修改该条目时 有其他人也进行了修改操作并提交,根据乐观锁原则,该操作为非法操作,停止操作抛出异常。
#另附
##查看postgresql的function
SELECT
pg_proc.proname AS "函数名称",
pg_type.typname AS "返回值数据类型",
pg_proc.pronargs AS "参数个数"
FROM
pg_proc
JOIN pg_type
ON (pg_proc.prorettype = pg_type.oid)
WHERE
pg_type.typname != 'void'
AND pronamespace = (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = 'public');
##删除function
drop function function_name (parameters_list);