如何使用触发器 Postgres 打印新值

now*_*y94 1 sql postgresql triggers plpgsql

我想为插入操作创建触发器,以及打印插入值的过程。

CREATE TRIGGER added_product_info_trigger
BEFORE INSERT
ON products
EXECUTE PROCEDURE added_product_info();
Run Code Online (Sandbox Code Playgroud)

还有我的程序

CREATE OR REPLACE FUNCTION added_product_info()
RETURNS trigger
AS
$$
    (Select p.productname, s.companyname from products as p, suppliers as s
    where p.supplierid = s.supplierid)
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

如何打印我插入的值?

kli*_*lin 5

Sql 函数无法返回trigger。您可能想编写一个 plpgsql 函数。

触发器函数无法生成任何输出(如查询结果select)。您可以使用raise notice将一些结果传递给客户端程序:

create or replace function added_product_info()
returns trigger as $$
declare 
    company text;
begin
    select companyname 
    from suppliers
    where supplierid = new.supplierid
    into company;
    raise notice 'inserted: "%" supplied by "%"', new.productname, company;
    return new;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

仅当声明了触发器时,记录new在触发器函数中才可见for each row (默认情况for each statement下,记录newold不可访问):

create trigger added_product_info_trigger
before insert on products
for each row
execute procedure added_product_info();
Run Code Online (Sandbox Code Playgroud)

如果是触发器,则before insert for each row必须返回new

请注意,客户必须准备好获取并处理通知。如果您在标准psql shell 程序中运行查询,您将得到:

insert into products values ('some product', 1);
NOTICE:  inserted: "some product" supplied by "company"
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

读: