pgsql之触发器与触发器函数
迫于学业压⼒,不得不使⽤pgsql。其复杂度远超mysql,不仅让我回味其中,久久不能⾃拔/wx
⾸先,咱到,打之看了⼀下,额,还是算了。
太复杂了,由于触发器后必须执⾏函数或者存储过程,所以触发器条⽬和函数条⽬关系⽐较密切,经常会相互跳转和引⽤,跳着跳着就不知道⾃⼰都看了些啥,抬起头叹⼝⽓,就只看的到顶层密密⿇⿇的tabs了。
再快⼀点!
终于,在同学的帮助下,我得知了创建触发器的⼀般格式:
create trigger trigger_name [before/after/instead of] [update | insert | delete] on table_name
for each [row | statement]
execute [function | procedure] function_name;
与之配套的是触发器函数
在pgsql中,可以定义⼀种叫做触发器函数的函数,故名思意,专门⽤在触发器响应后执⾏,其⼀般定义如下:
sql触发器的使用create or replace function function_name() returns trigger  -- 返回⼀个触发器
language 'plpgsql'
AS $$
BEGIN
...
END;
$$
更⽅便的是,可以直接根据触发器的相应操作(delete、insert、update)等来直接引⽤NEW和OLD这两张表,这两张表(也或者是表项)的意义以后有时间来补上
另外,我从mysql必知必会中看到了⼀些关于操作与可引⽤表之间的关系,如下:
INSERT触发器
可以引⽤⼀个名为NEW的虚拟表,访问那些被插⼊的⾏
即使使⽤BEFORE INSERT,NEW表中的值也可以被修改
对于那些会⾃动⽣成值的插⼊(⽐如插⼊⼀个订单,⾃动增序为其分配⼀个序号),在BEFORE时NEW.num将会永远是0,因此这种情况要使⽤AFTER来获取正确的序号
DELETE触发器
可以引⽤⼀个名为OLD的虚拟表,访问那些被删除的⾏
OLD中的值是只读的,⽆法写
UPDATE触发器
可以引⽤⼀个名为OLD的虚拟表,访问那些被更新之前的⾏
可以引⽤⼀个名为NEW的虚拟表,访问那些被更新之后的⾏
BEFORE UPDATE允许更新NEW中的值
OLD只读
那么,开始!
CREATE or replace function addLog() returns trigger
language 'plpgsql'
AS $$
BEGIN
insert into departments_copy_log(login_name, update_date, dept_no, dept_name_old, dept_name_new)  -- session_user是登录pgsql账户的⽤户名
values (session_user, now(), new.dept_no, old.dept_name, new.dept_name);  -- 直接引⽤new和old,这⾥代表的应该是有变更的表项
return new;  -- 这⾥得返回点什么,否则会报函数没有返回的错误。。。具体原因以后补上
END;
create trigger log_department_change after update on departments_copy
for each row
execute procedure addLog();  -- 这⾥试过function,也⾏,好像pgsql不太区分存储过程和函数
$$
这⼉有⼀篇更详细的触发器⽂章

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。