5

DBに2つのテーブルがあるとします(postgresql-9.x)

CREATE TABLE FOLDER (
    KEY BIGSERIAL PRIMARY KEY,
    PATH TEXT,
    NAME TEXT
);
CREATE TABLE FOLDERFILE (
    FILEID BIGINT,
    PATH TEXT,
    PATHKEY BIGINT
);

に挿入または更新するたびに自動的に更新FOLDERFILE.PATHKEYします:FOLDER.KEYFOLDERFILE

CREATE OR REPLACE FUNCTION folderfile_fill_pathkey() RETURNS trigger AS $$
DECLARE
  pathkey bigint;
  changed boolean;
BEGIN
  IF tg_op = 'INSERT' THEN
     changed := TRUE;
    ELSE IF old.FILEID != new.FILEID THEN
       changed := TRUE;
    END IF;
  END IF;
  IF changed THEN
     SELECT INTO pathkey key FROM FOLDER WHERE PATH = new.path;
     IF FOUND THEN
       new.pathkey = pathkey;
     ELSE
       new.pathkey = NULL;
     END IF;
  END IF;
  RETURN new;
END
$$ LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER folderfile_fill_pathkey_trigger AFTER INSERT OR UPDATE 
ON FOLDERFILE FOR EACH ROW EXECUTE PROCEDURE fcliplink_fill_pathkey();

したがって、問題は関数のfolderfile_fill_pathkey()ボラティリティに関するものです。ドキュメンテーションは言う

副作用のある関数には VOLATILE というラベルを付ける必要があります

しかし、私が理解している限り、この関数は依存するテーブルのデータを変更しないため、この関数を としてマークできますIMMUTABLE。それは正しいですか?

FOLDERFILE次のように、同じトランザクション内に多くの行を一括挿入すると、IMMUTABLE トリガー関数に問題はありますか?

BEGIN;
INSERT INTO FOLDERFILE ( ... );
...
INSERT INTO FOLDERFILE ( ... );
COMMIT;
4

1 に答える 1