【问题标题】:how to fix this trigger error in PostgreSQL [duplicate]如何在 PostgreSQL 中修复此触发错误 [重复]
【发布时间】:2022-02-01 04:12:45
【问题描述】:

我的代码出现语法错误,我不明白为什么 我错过了什么吗? 另外,我读了这个我没有得到我的答案 syntax Error in PostgreSQL when I try to create Trigger

CREATE TRIGGER MyExampleName AFTER INSERT ON baskets
FOR EACH ROW BEGIN
    UPDATE customers 
        SET customers.credit=customers.credit - NEW.amount 
        WHERE customers.id = NEW.customer_id;
END;

也尝试过这样的:


CREATE TRIGGER MyExampleName AFTER INSERT ON baskets
FOR EACH ROW AS $$ BEGIN
    UPDATE customers 
        SET customers.credit=customers.credit - NEW.amount 
        WHERE customers.id = NEW.customer_id;
END;
$$ LANGUAGE plpgsql;

错误:

ERROR:  syntax error at or near "BEGIN"
LINE 2: FOR EACH ROW BEGIN
                     ^
SQL state: 42601
Character: 67

【问题讨论】:

  • 请仔细阅读链接的问题。 CREATE TRIGGER 不包括正文中的实际触发代码。你需要一个单独的CREATE FUNCTION 一个完整的例子也可用in the manual
  • 您使用的是哪个 Postgres 版本?
  • @oxfist 我正在使用最新版本

标签: sql postgresql triggers plpgsql


【解决方案1】:

我想说对您问题的第一条评论几乎涵盖了所有内容。您不能将触发器代码放在触发器主体中,您必须首先创建一个单独的函数并将函数调用包含在触发器主体中。

这个例子直接来自Postgres docs

-- 1. Create the function that does what you need
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
        -- Check that empname and salary are given
        IF NEW.empname IS NULL THEN
            RAISE EXCEPTION 'empname cannot be null';
        END IF;
        IF NEW.salary IS NULL THEN
            RAISE EXCEPTION '% cannot have null salary', NEW.empname;
        END IF;

        -- Who works for us when they must pay for it?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
        END IF;

        -- Remember who changed the payroll when
        NEW.last_date := current_timestamp;
        NEW.last_user := current_user;
        RETURN NEW;
    END;
$emp_stamp$ LANGUAGE plpgsql;

-- 2. Create the trigger with the 'EXECUTE FUNCTION function_name' part
--    replacing the actual function name from step 1.
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE FUNCTION emp_stamp();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多