在postgresql中创建触发器和函数

时间:2012-12-06 21:55:21

标签: function postgresql stored-procedures triggers

如何在trigger function之前创建adding/updatingfunction应该检查具有相同id的记录(即id与现有{的比较与objects具有相同属性的{1}}如果找到具有id的记录,则该条目设置为temporary_object,然后添加包含相应值的条目在该记录中找到的属性(除了为新记录设置的属性除外),当time_dead为空时,新时间的time_dead等于当前时刻的那个时间。因此,新记录time_create就像time_create祖先一样。 如果找到具有该id的记录,则将其添加到数据库中,并将该机构添加为当前时间的time_dead's

例如,这里是一个简单的解释(仅用于解释目的)

time_create

所以如果一个叫id 1的henry在06.12进入房间并在07.12离开,下一次再次进入另一个房间时time_dead将等于time_create(因此旧条目的time_dead和新条目的time_create将相等) ) 这些是我的表格,以sql格式

id time_create   time-dead  student  amount

 1  06.12           07.12    henry   500

 1  07.12                    henry   1000

这就是我想要做的但我害怕我不知道如何完成但是我100%不对可能会有所帮助

CREATE TABLE temporary_object
(
  id integer NOT NULL,
  time_create timestamp without time zone NOT NULL,
  time_dead timestamp without time zone,
  CONSTRAINT temporary_object_pkey PRIMARY KEY (id, time_create)
)

CREATE TABLE persons
(
  fname text,
  fsurname text,
)
INHERITS (temporary_object)


CREATE TABLE rooms
(
  roomnum integer,
  course integer,
  passport text,
  students_number text
)
INHERITS (temporary_object)

这是函数

CREATE TRIGGER trigger2
 BEFORE INSERT OR UPDATE
 ON persons
 FOR EACH ROW
 EXECUTE PROCEDURE func1();

1 个答案:

答案 0 :(得分:5)

我不能告诉你我在你的问题中遗漏了什么,但我试着回答我的想法。

行级触发器可以访问受NEWOLD变量影响的行的版本(取决于TG_OP)。在这种情况下,您可以使用NEW

CREATE OR REPLACE FUNCTION func1() 
RETURNS TRIGGER AS 
$persons$
DECLARE
    i integer;
BEGIN
    IF TG_OP = 'INSERT'
    THEN
        UPDATE persons 
        SET time_dead = NEW.time_create
        WHERE 
            id = NEW.id -- we are looking for the same ID
            AND time_dead IS NULL
        ;
    ELSE -- UPDATE
        -- do here something
    END IF;
END;
$persons$
LANGUAGE plpgsql;

这只是一个启动器,根据您的需要进行修改。