Thông báo lỗi là
Bạn có hai EXECUTE
lệnh:
_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;
Phần duy nhất có thể là NULL
là table_name
.
Cơ hội duy nhất cho table_name
trở thành NULL
ở đây:
SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;
Vì vậy, nguyên nhân phải là một trong hai lý do :
-
NEW.notification_id
làNULL
. -
Không có hàng nào trong
notifications
choNEW.notification_id
đã cho .
Hãy thử chức năng kích hoạt đã sửa đổi này để gỡ lỗi :
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;
-
Loại bỏ các biến không sử dụng và đơn giản hóa mã. (Đây rõ ràng là một ví dụ đơn giản hóa.)
-
Trong số những thứ khác, bạn không cần
date_trunc()
ở tất cả. Chỉ cần cung cấp dấu thời gian ban đầu choto_char()
. -
Không ích gì khi sử dụng
varchar(n)
. Chỉ cần sử dụngtext
hoặcvarchar
. -
Tránh quá nhiều nhiệm vụ không cần thiết - tương đối đắt trong PL / pgSQL.
-
-
Thêm
RAISE
để kiểm tra giả thuyết của tôi.
Nếu bạn nhận được thông báo lỗi, việc phân biệt giữa hai nguyên nhân có thể xảy ra sẽ là bước tiếp theo. Nên tầm thường ...