エラーメッセージは
です。
2つのEXECUTE
があります コマンド:
_query := 'CREATE TABLE public.'
|| quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
EXECUTE _query;
...
EXECUTE 'INSERT INTO public.'
|| quote_ident(_table_name) || ' VALUES ($1.*)' USING NEW;
NULL
にできる唯一の部分 table_name
です 。table_name
の唯一のチャンス NULL
になる ここにあります:
SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;
したがって、原因は2つの理由のいずれかである必要があります :
-
NEW.notification_id
NULL
です 。 -
notifications
に行がありません 指定されたNEW.notification_id
に対して 。
このデバッグ用に変更されたトリガー関数を試してください :
CREATE OR REPLACE FUNCTION partition_evidence_by_month()
RETURNS trigger AS
$func$
DECLARE
_table_name text;
BEGIN
SELECT 'evidence-' || to_char(raised_local_time, 'YYYY-MM')
FROM public.notifications -- schema-qualify to be sure
WHERE id = NEW.notification_id
INTO _table_name;
IF _table_name IS NULL THEN
RAISE EXCEPTION '_table_name is NULL. Should not occur!';
END IF;
IF NOT EXISTS ( -- create table if it does not exist
SELECT 1
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND c.relname = _table_name
AND n.nspname = 'public') THEN
EXECUTE 'CREATE TABLE public.'
|| quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
END IF;
EXECUTE 'INSERT INTO public.'
|| quote_ident(_table_name) || ' VALUES $1' -- Use NEW row directly
USING NEW; -- write data to the partition table
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
-
未使用の変数を削除し、コードを簡素化します。 (これは明らかに単純化された例です。)
-
特に、
date_trunc()
は必要ありません。 まったく。元のタイムスタンプをto_char()
にフィードするだけです 。 -
varchar(n)
を使用しても意味がありません 。text
を使用するだけです またはvarchar
。 -
不要な割り当てが多すぎるのは避けてください。PL/pgSQLでは比較的コストがかかります。
-
-
RAISE
を追加します
エラーメッセージが表示された場合は、考えられる2つの原因を区別することが次のステップになります。些細なことです...