2

trigger functionadding/updatingに を作成するにはどうすればよいですか。 は、同じプロパティをfunction持つレコードをチェックする必要があります(つまり、 と同じプロパティを持つ既存のものとのid比較)。ID を持つレコードが見つかった場合、そのエントリは に設定され、追加されます。そのレコードで見つかった属性の対応する値を含むエントリ (新しいレコードに設定されているものを除く)。が空の場合、新しい時間は現時点でのその時間に等しくなります。したがって、新しい記録は祖先のようなものです。その ID を持つレコードが見つかった場合、現在の時刻として施設とともにデータベースに追加されます。idobjectstemporary_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

したがって、id 1 の henry という学生が 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

あなたの質問に何が欠けているかはわかりませんが、私が理解したと思うことには答えようとします。

行レベル トリガーは、NEWおよびOLD変数で影響を受ける行のバージョンにアクセスできます ( によって異なります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 に答える