【问题标题】:PostgreSQL: Trigger ProceduresPostgreSQL:触发过程
【发布时间】:2015-02-21 10:05:27
【问题描述】:

我的 postgresql 数据库中有这两个表:

CREATE TABLE credit
(
  id serial NOT NULL,
  id_emp integer,
  amount double precision,
  refund double precision,
  rest double precision,
  stat integer,
  CONSTRAINT credit_pkey PRIMARY KEY (id)
)

还有这个:

CREATE TABLE emp_with_credit
(
  id serial NOT NULL,
  id_emp integer,
  stat integer,
  CONSTRAINT emp_with_credit_pkey PRIMARY KEY (id)
)

我想创建一个过程触发器ON UPDATE 来完成这项工作:
当我更新credit 表中的一行时,我必须检查其余部分是否 = 0:设置 credit 表的 stat 列 = 0 并获取更新行的 id_emp 并设置 emp_with_credit 表的 stat 列 = 0 当 credit.id_emp = emp_with_credit.id_emp

编辑:
到目前为止我做了什么:

CREATE FUNCTION credit_stamp() RETURNS trigger AS $credit_stamp$
    BEGIN
        IF NEW.rest = 0 THEN
        NEW.stat = 0;
    END IF;
        RETURN NEW;
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER credit_stamp BEFORE UPDATE ON credit
    FOR EACH ROW EXECUTE PROCEDURE credit_stamp();

这很好用,但仍然是第二部分,当credit.id_emp = emp_with_credit.id_emp 时,我必须设置emp_with_credit table = 0 的stat 列。

【问题讨论】:

  • @FrankHeikens 检查我的更新。
  • 看起来您需要在函数中对表 emp_with_credit 进行更新。
  • 永远不要使用浮点类型(浮点、实数、双精度)来赚钱。改用 numeric()。
  • @MikeSherrill'CatRecall' 你能解释一下区别吗?

标签: postgresql triggers procedure


【解决方案1】:

您的触发器中没有 UPDATE 语句。

CREATE FUNCTION credit_stamp()
  RETURNS TRIGGER AS $$
BEGIN
  IF NEW.rest = 0
  THEN
    UPDATE emp_with_credit SET stat = 0 WHERE emp_with_credit.id_emp = NEW.id_emp
    NEW.stat = 0;
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2011-05-02
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多