【问题标题】:creating triggers and functions in postgresql在 postgresql 中创建触发器和函数
【发布时间】:2012-12-06 21:55:20
【问题描述】:

我如何在adding/updating 之前创建trigger functionfunction 应该检查具有相同id 的记录(即比较id 与现有objects 具有相同的属性@ 987654327@)如果找到了一个id的记录,则将该条目设置为time_dead,然后它添加一个条目,其中包含在该记录中找到的属性的相应值(除了那些设置为新记录),当time_dead 为空时,新时间的time_create 等于当前时刻的那个时间。因此,新记录time_create 就像time_dead's 的祖先。 如果找到具有该 id 的记录,则将其添加到数据库中,并以当前时间的time_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=

【问题讨论】:

    标签: function postgresql stored-procedures triggers


    【解决方案1】:

    我无法告诉你我在你的问题中遗漏了什么,但我会尝试回答我认为我理解的内容。

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

    这只是一个入门,请根据您的需要进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多