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

标签 sql postgresql triggers plpgsql

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

CREATE TRIGGER added_product_info_trigger
BEFORE INSERT
ON products
EXECUTE PROCEDURE added_product_info();

还有我的程序

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;

如何打印我插入的值?

最佳答案

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;

记录new仅当声明触发器时才在触发器函数中可见 for each row (当记录 for each statementnew 不可访问时,默认为 old):

create trigger added_product_info_trigger
before insert on products
for each row
execute procedure added_product_info();

如果触发器是 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

阅读:

关于sql - 如何使用触发器 Postgres 打印新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859642/

相关文章:

mysql - 多个MySQL Table JOINS需要将1个表的结果concat成一个列字段

MYSQL - 用于将 VARCHAR 中的时间转换为 INTEGER 中的秒的触发器正在插入多行,而它应该只插入

mysql - 找到支付最高薪水的部门

java - HSQLDB 意外标记 :?

mysql - SQL - 检查 ID 是否包含相同 ID 的值

node.js - Sequelize - 更新 FOREIGN KEY 约束 win ONDELETE CASCADE

Ruby-on-rails Postgres 查询

sql - PostgreSQL 在第 6 次执行同一查询后锁定

SQLite 和递归触发器

sql - Postgresql 应用程序插入和触发器性能