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.KEY
FOLDERFILE
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;