2016-06-15 49 views
2

我嘗試做中解釋說:如何將JSON作爲PostgreSQL中的觸發器中的新數據存儲?

https://wiki.postgresql.org/wiki/Audit_trigger

Auditing values as JSON

For PostgreSQL 9.2, or 9.1 with the fantastic json_91 addon, you can log the old and new values in the table as structured json instead of flat text, giving you much more power to query your audit history. Just change the types of v_old_data, v_new_data, original_data and new_data from TEXT to json, then replace ROW(OLD.) and ROW(NEW.) with row_to_json(OLD) and row_to_json(NEW) respectively.

然而,這給我一個錯誤:

CREATE OR REPLACE FUNCTION add_log (name text, Action TEXT, data jsonb, OUT RETURNS BOOLEAN) 
AS $$ 
BEGIN 
    RETURNS = true; 
END; 
$$ 
LANGUAGE 'plpgsql'; 

CREATE OR REPLACE FUNCTION log_city() RETURNS TRIGGER AS 
$$ 
DECLARE 
v_new_data jsonb; 
BEGIN 
    IF (TG_OP = 'UPDATE') THEN 
     RETURN NEW; 
    ELSIF (TG_OP = 'INSERT') THEN 
     v_new_data := row_to_jsonb(NEW); 
     EXECUTE add_log('City', 'City.New', v_new_data); 
     RETURN NEW; 
    END IF; 
    RETURN NULL; -- result is ignored since this is an AFTER trigger 
END; 
$$ LANGUAGE plpgsql; 

INSERT INTO Location (city, state, country) values ('a', 'b' , 'c') 

它說:

ERROR: function row_to_jsonb(location) does not exist

如果我把v_new_data := row_to_jsonb(ROW(NEW));那麼我得到:

ERROR: function row_to_jsonb(record) does not exist

+0

我再試一次,是的,與JSON的工作,但與JSONB沒有。 – mamcx

回答

1

它在documentation

Table 9-42 shows the functions that are available for creating json and jsonb values. (There are no equivalent functions for jsonb, of the row_to_json and array_to_json functions. However, the to_jsonb function supplies much the same functionality as these functions would.)

說這樣是row_to_json有被使用。 row_to_jsonb不存在,但row_to_json也產生JSONB類型的所需結果。

相關問題