2

だから私の問題は簡単です。prod多くのテーブルを持つスキーマとlog、まったく同じテーブルと構造を持つ別のスキーマがあります (主キーの変更はそれだけです)。UPDATEor DELETEin the schemaを行うときprod、古いデータをスキーマに記録したいlog

更新または削除後に次の関数を呼び出しています。

CREATE FUNCTION prod.log_data() RETURNS trigger
LANGUAGE plpgsql AS $$
DECLARE
    v RECORD;
    column_names text;
    value_names text;
BEGIN

    -- get column names of current table and store the list in a text var
    column_names = '';
    value_names = '';
    FOR v IN SELECT * FROM information_schema.columns WHERE table_name = quote_ident(TG_TABLE_NAME) AND table_schema = quote_ident(TG_TABLE_SCHEMA) LOOP
        column_names = column_names || ',' || v.column_name;
        value_names = value_names || ',$1.' || v.column_name;
    END LOOP;

    -- remove first char ','
    column_names = substring( column_names FROM 2);
    value_names = substring( value_names FROM 2);

    -- execute the insert into log schema
    EXECUTE 'INSERT INTO log.' || TG_TABLE_NAME || ' ( ' || column_names || ' ) VALUES ( ' || value_names || ' )' USING OLD;

    RETURN NULL; -- no need to return, it is executed after update
END;$$;

厄介な部分は、各行から列名を取得する必要があることinformation_schemaです。私はむしろこれを使用したいと思います:

    EXECUTE 'INSERT INTO log.' || TG_TABLE_NAME || ' SELECT ' || OLD;

ただし、一部の値は次のNULLように実行される可能性があります。

INSERT INTO log.user SELECT 2,,,"2015-10-28 13:52:44.785947" INSERT INTO log.user SELECT 2,NULL,NULL,"2015-10-28 13:52:44.785947" の代わりに

",,"に変換するアイデアはあり",NULL,"ますか?

ありがとう

-クエンティン

4

1 に答える 1