2

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

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

id time_create   time-dead  student  amount

 1  06.12           07.12    henry   500

 1  07.12                    henry   1000

因此,如果一个名为 henry 且 ID 为 1 的学生在 06.12 进入一个房间,并在下次他再次进入另一个房间时于 07.12 离开时,time_dead 将等于 time_create(因此旧条目的 time_dead 和新条目的 time_create - 将相等)这些是我下面的表格是 sql 格式

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)

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

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

这就是功能

 CREATE OR REPLACE FUNCTION func1() RETURNS TRIGGER AS $persons$
 DECLARE
        time_create          integer;
        time_dead     timestamp;
        id       timestamp;
    BEGIN

 IF (TG_OP = 'INSERT') THEN

            time_create=
4

1 回答 1

6

我不能告诉你我从你的问题中遗漏了什么,但我试着回答我认为我理解的内容。

行级触发器可以访问受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;

这只是一个初学者,根据您的需要进行修改。

于 2012-12-06T22:12:52.343 回答