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

Jas*_*r33 3 postgresql triggers insert

我知道如何使用SQL Server或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
Run Code Online (Sandbox Code Playgroud)

该函数在按以下方式调用时按预期工作 SELECT welcome(1234);

但是,我想做的是根据AFTER新用户插入另一个表且该用户是第一个也是唯一的用户的条件来调用或触发此FUNCTION :

INSERT INTO my_table_2 (user_id,name,...) VALUES (5678,'John Doe',...);
Run Code Online (Sandbox Code Playgroud)

并且满足以下条件:

SELECT COUNT(*) from my_table_2 WHERE <my conditions are met>;
Run Code Online (Sandbox Code Playgroud)

完全且仅返回 1

因此,相对而言,我正在努力实现:

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

我看过一些示例,并且对CREATE FUNCTION x() AS TRIGGER语法不太了解,似乎Postgres正在引导我朝这个方向发展,但我的情况下缺少示例。救命!(并预先感谢!)

Pat*_*ick 5

在SQL标准中,您定义了triggertrigger 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;
Run Code Online (Sandbox Code Playgroud)

和触发器:

CREATE TRIGGER tr_call_welcome
AFTER INSERT ON my_table_2
FOR EACH ROW EXECUTE PROCEDURE call_welcome();
Run Code Online (Sandbox Code Playgroud)