postgresql中利用INSTEAD OF触发器实现不可更新视图的增删改

利用INSTEAD OF触发器实现不可更新视图的增删改

在postgresql中创建的视图,会由于诸如没有包含表的全部主键,涉及聚集函数等原因不能进行增删改,原因在于视图依赖于表,当进行视图的更新的时候,必定要对原本的表进行更新,而当对视图的更新不能有效的转换为对表的更新时就会产生视图不可更新的情况。

    以上提到的不能进行有效的转换,是指的对于postgresql而言,而对于数据库的开发者和使用者而言,视图本身往往有具体的含义,在这些含义的基础上就可以进行数据的增删改,这时就要借助触发器来完成相应的操作。
    举一个非常简单的例子,一个表中存了人们在某家店的购买记录,而每个人查看的时候只能看到他自己的购买记录,这时可以用一个视图来展现。如果每个人有一个唯一对应的id,那么这个视图里是不需要包含这个id的,因为这个视图就是某个固定id对应的消费明细。显然这里面id就是这个表的主键,而视图中偏偏没有这个主键,这就导致在视图中插入数据的时候缺失主键,利用触发器就可以以把主键设置为当前用户的方式完成插入。
    我们以插入为例说明这个触发器如何设置。假设这个表有4个属性字段,分别为用户id,商品id,购买日期和花费金额。表名为test_table,视图名为test_view。

--定义插入函数
CREATE OR REPLACE FUNCTION INSERT_FUNC()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO PUBLIC."test_table" 
--new代表插入进来的信息
VALUES(CURRENT_USER, NEW."ANO", NEW."DATE", NEW."COST");
--return new来执行更新
RETURN NEW;
END;
$$LANGUAGE plpgsql;
--定义触发器
CREATE TRIGGER INSERT_TRIGGER
INSTEAD OF INSERT ON "test_view" 
--对插入的每一行都要触发该触发器
FOR EACH ROW 
EXECUTE PROCEDURE INSERT_FUNC();
insert into "test_view" values('1001', '2019-10-19', '300')
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值