如何根据另一个 table 的结果触发或调用一个 table 的 INSERT 函数?

How do I trigger or call a function on INSERT to one table based on result of another table?

我知道如何使用 SQL 服务器或 Sybase 执行此操作,但似乎无法使用 Postgres 9.4 正确执行此操作。我有一个按预期工作的功能:

CREATE OR REPLACE FUNCTION "public"."welcome"(u_id INT DEFAULT 1234) 
  RETURNS "void" 
  AS $$
  INSERT INTO my_table_1 (title,body,category,user_id,created_at)
  VALUES ('Welcome!', '<some text>','general',u_id,now())
  $$ LANGUAGE sql

此函数在调用 SELECT welcome(1234);

时按预期工作

但是,我想要做的是根据条件调用或触发此功能 AFTER 新用户被插入到另一个 table 并且该用户是第一个也是唯一的用户:

INSERT INTO my_table_2 (user_id,name,...) VALUES (5678,'John Doe',...);

并且满足以下条件:

SELECT COUNT(*) from my_table_2 WHERE <my conditions are met>;

returns 完全只有 1

因此,从语义上讲,我正在努力完成:

call TRIGGER welcome(1234) AFTER INSERT into my_table_2 where my conditions are met

我看过一些示例,但不太了解 CREATE FUNCTION x() AS TRIGGER 语法,Postgres 似乎在引导我朝这个方向发展,但我的案例中缺少示例。帮助! (提前致谢!)

在 SQL 标准中,您定义了一个 trigger,它会在特定操作发生时触发 trigger function。在您的情况下,您想创建一个 AFTER INSERT 触发器,其触发器函数调用您的 "welcome" 函数。

首先触发函数:

CREATE FUNCTION call_welcome() RETURNS trigger AS $$
DECLARE
  cnt integer;
BEGIN
  SELECT count(*) INTO cnt FROM my_table_2 WHERE ...;
  IF cnt = 1 THEN
    PERFORM welcome(NEW.user_id);
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

触发器:

CREATE TRIGGER tr_call_welcome
AFTER INSERT ON my_table_2
FOR EACH ROW EXECUTE PROCEDURE call_welcome();