Bạn có thể triển khai điều đó khá thuận tiện với hstore
toán tử #=
:
Đảm bảo rằng mô-đun bổ sung được cài đặt đúng cách ( một lần mỗi cơ sở dữ liệu), trong một lược đồ được bao gồm trong search_path
của bạn :
- Cách sử dụng toán tử% từ tiện ích mở rộng pg_trgm?
- Cách tốt nhất để cài đặt hstore trên nhiều lược đồ trong cơ sở dữ liệu Postgres?
Chức năng kích hoạt:
CREATE OR REPLACE FUNCTION tbl_insup_bef()
RETURNS TRIGGER AS
$func$
DECLARE
_prefix CONSTANT text := 'some prepend data'; -- your prefix here
_prelen CONSTANT int := 17; -- length of above string (optional optimization)
_col text := quote_ident(TG_ARGV[0]);
_val text;
BEGIN
EXECUTE 'SELECT $1.' || _col
USING NEW
INTO _val;
IF left(_val, _prelen) = _prefix THEN
-- do nothing: prefix already there!
ELSE
NEW := NEW #= hstore(_col, _prefix || _val);
END IF;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
Kích hoạt (sử dụng lại cùng một func cho nhiều bảng):
CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW
EXECUTE PROCEDURE tbl_insup_bef('fieldName'); -- unquoted, case-sensitive column name
Liên quan chặt chẽ hơn với giải thích và lời khuyên:
- Chỉ định một cột với tên cột động
- Làm cách nào để truy cập trường MỚI hoặc CŨ chỉ được cung cấp tên của trường?
- Nhận các giá trị từ các cột khác nhau trong một trình kích hoạt chung