【问题标题】:trigger SEQUENCE after each SELECT query在每个 SELECT 查询后触发 SEQUENCE
【发布时间】:2020-12-07 18:04:40
【问题描述】:

我已经创建了一个序列,我想在表上的每个 SELECT 查询之后触发它

DROP SEQUENCE IF EXISTS kadry.wyplaty_seq;
CREATE SEQUENCE kadry.wyplaty_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 7771
  CACHE 1;

所以我正在尝试创建一个如下所示的函数

CREATE OR REPLACE FUNCTION kadry.inc_trig()
    RETURNS TRIGGER AS  
$$
BEGIN
    SELECT nextval('kadry.wyplaty_seq');
END;
$$
LANGUAGE 'plpgsql' VOLATILE;

最后创建一个触发器

DROP TRIGGER IF EXISTS increment_trigger ON kadry.wyplaty;
CREATE TRIGGER increment_trigger AFTER SELECT 
    ON kadry.wyplaty 
    EXECUTE PROCEDURE kadry.inc_trig();

问题出在这一行

CREATE TRIGGER increment_trigger AFTER SELECT

我知道应该是这样的

CREATE TRIGGER increment_trigger AFTER AFTER INSERT OR UPDATE OR DELETE  

有人知道在每次 SELECT 查询后我应该怎么做才能触发我的函数吗?

【问题讨论】:

  • 不能在 Select 上触发触发器。请参阅documentation)。
  • 您能从业务角度描述一下您想要实现的目标吗?是某种审计吗?
  • @Lukasz Szozda 这只是一个学生练习,不是更大项目的一部分。只是有一个小数据库,我必须测试一些像问题一样的短函数
  • 所以答案是,不,你不能使用触发器
  • 您可以在this SO question 中找到一个非常相似的问题的答案。

标签: postgresql triggers sequence plpgsql sql-function


【解决方案1】:

SELECT 上没有触发器这样的东西。 SELECT by design 也应该没有任何副作用。


这样说真的很丑:

用函数包装查询:

CREATE OR REPLACE FUNCTION f_wyplaty()
RETURNS TABLE(id INTEGER)
AS $$
DECLARE 
     b    integer;
BEGIN
    b := nextval('wyplaty_seq');
    RETURN QUERY
    SELECT *
    FROM wyplaty;
END
$$ LANGUAGE plpgsql;

查询函数而不是表:

SELECT * FROM f_wyplaty();

db<>fiddle demo

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2020-05-17
    • 2015-01-26
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多