Re: PL/pgSQL: Logging Trigger. Advice/comments/other?

Lists: pgsql-sql
From: Larry Rosenman <ler(at)lerctr(dot)org>
To: pgsql-sql(at)postgresql(dot)org
Subject: PL/pgSQL: Logging Trigger. Advice/comments/other?
Date: 2003-05-14 20:04:21
Message-ID: 382520000.1052942661@lerlaptop-red.iadfw.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Ok, I finally finished this damn trigger to log changes to ONE frapping
table.

I'm wondering if any of you PL/pgSQL guru's out there see any better way to
do
this:

CREATE OR REPLACE FUNCTION networks_trigger_log () RETURNS "trigger"
AS 'DECLARE
record_fields_old text;
record_values_old text;
record_fields_new text;
record_values_new text;
query_string_old text;
query_string_new text;
BEGIN
query_string_old := ''INSERT INTO networks_log'';
query_string_new := ''INSERT INTO networks_log'';
record_fields_old := ''user_id,update_at,update_type,update_ver'';
record_fields_new := ''user_id,update_at,update_type,update_ver'';
record_values_old := ''CURRENT_USER,CURRENT_TIMESTAMP,'' ||
quote_literal(TG_OP) || '','' || quote_literal(''O'');
record_values_new := ''CURRENT_USER,CURRENT_TIMESTAMP,'' ||
quote_literal(TG_OP) || '','' || quote_literal(''N'');
IF TG_OP = ''INSERT''
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''netblock'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.netblock::inet::text) ;
IF NEW.router NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''router'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.router) ;
END IF;
IF NEW.interface NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''interface'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.interface) ;
END IF;
IF NEW.dest_ip NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''dest_ip'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.dest_ip::text) ;
END IF;
IF NEW.mis_token NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''mis_token'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.mis_token) ;
END IF;
IF NEW.assigned_date NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_date'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_date) ;
END IF;
IF NEW.assigned_by NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_by'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_by) ;
END IF;
IF NEW.justification_now NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_now'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_now) ;
END IF;
IF NEW.justification_1yr NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_1yr'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_1yr) ;
END IF;
IF NEW.cust_asn NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''cust_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.cust_asn) ;
END IF;
IF NEW.comments NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''comments'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.comments) ;
END IF;
IF NEW.other_reference NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''other_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.other_reference) ;
END IF;
IF NEW.parent_asn NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''parent_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.parent_asn) ;
END IF;
IF NEW.status NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''status'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.status) ;
END IF;
IF NEW.purpose NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''purpose'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.purpose) ;
END IF;
IF NEW.customer_reference NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''customer_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.customer_reference) ;
END IF;
IF NEW.natblock NOTNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''natblock'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.natblock) ;
END IF;
query_string_new := query_string_new || ''('' ||
record_fields_new || '') VALUES('' ||
record_values_new || '')'';
EXECUTE query_string_new;
RETURN new;
END IF;
IF TG_OP = ''DELETE''
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''netblock'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.netblock::inet::text) ;
IF OLD.router NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''router'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.router) ;
END IF;
IF OLD.interface NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''interface'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.interface) ;
END IF;
IF OLD.dest_ip NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''dest_ip'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.dest_ip::text) ;
END IF;
IF OLD.mis_token NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''mis_token'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.mis_token) ;
END IF;
IF OLD.assigned_date NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_date'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_date) ;
END IF;
IF OLD.assigned_by NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_by'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_by) ;
END IF;
IF OLD.justification_now NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_now'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_now) ;
END IF;
IF OLD.justification_1yr NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_1yr'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_1yr) ;
END IF;
IF OLD.cust_asn NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''cust_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.cust_asn) ;
END IF;
IF OLD.comments NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''comments'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.comments) ;
END IF;
IF OLD.other_reference NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''other_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.other_reference) ;
END IF;
IF OLD.parent_asn NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''parent_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.parent_asn) ;
END IF;
IF OLD.status NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''status'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.status) ;
END IF;
IF OLD.purpose NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''purpose'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.purpose) ;
END IF;
IF OLD.customer_reference NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''customer_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.customer_reference) ;
END IF;
IF OLD.natblock NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''natblock'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.natblock) ;
END IF;
query_string_old := query_string_old || ''('' ||
record_fields_old || '') VALUES('' ||
record_values_old || '')'';
EXECUTE query_string_old;
RETURN old;
END IF;
IF TG_OP = ''UPDATE''
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''netblock'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.netblock::inet::text) ;
record_fields_new := record_fields_new || '','' ||
quote_ident(''netblock'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.netblock::inet::text) ;
IF NEW.router NOTNULL AND OLD.router NOTNULL AND
NEW.router <> OLD.router
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''router'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.router) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''router'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.router) ;
END IF;
IF NEW.router ISNULL AND OLD.router NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''router'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.router) ;
END IF;
IF NEW.router NOTNULL AND OLD.router ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''router'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.router) ;
END IF;
IF NEW.interface NOTNULL AND OLD.interface NOTNULL AND
NEW.interface <> OLD.interface
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''interface'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.interface) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''interface'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.interface) ;
END IF;
IF NEW.interface ISNULL AND OLD.interface NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''interface'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.interface) ;
END IF;
IF NEW.interface NOTNULL AND OLD.interface ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''interface'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.interface) ;
END IF;
IF NEW.dest_ip NOTNULL AND OLD.dest_ip NOTNULL AND
NEW.dest_ip <> OLD.dest_ip
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''dest_ip'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.dest_ip::text) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''dest_ip'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.dest_ip::text) ;
END IF;
IF NEW.dest_ip ISNULL AND OLD.dest_ip NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''dest_ip'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.dest_ip::text) ;
END IF;
IF NEW.dest_ip NOTNULL AND OLD.dest_ip ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''dest_ip'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.dest_ip::text) ;
END IF;
IF NEW.mis_token NOTNULL AND OLD.mis_token NOTNULL AND
NEW.mis_token <> OLD.mis_token
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''mis_token'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.mis_token) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''mis_token'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.mis_token) ;
END IF;
IF NEW.mis_token ISNULL AND OLD.mis_token NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''mis_token'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.mis_token) ;
END IF;
IF NEW.mis_token NOTNULL AND OLD.mis_token ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''mis_token'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.mis_token) ;
END IF;
IF NEW.assigned_date NOTNULL AND OLD.assigned_date NOTNULL AND
NEW.assigned_date <> OLD.assigned_date
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_date'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_date) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_date'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_date) ;
END IF;
IF NEW.assigned_date ISNULL AND OLD.assigned_date NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_date'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_date) ;
END IF;
IF NEW.assigned_date NOTNULL AND OLD.assigned_date ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_date'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_date) ;
END IF;
IF NEW.assigned_by NOTNULL AND OLD.assigned_by NOTNULL AND
NEW.assigned_by <> OLD.assigned_by
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_by'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_by) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_by'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_by) ;
END IF;
IF NEW.assigned_by ISNULL AND OLD.assigned_by NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''assigned_by'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.assigned_by) ;
END IF;
IF NEW.assigned_by NOTNULL AND OLD.assigned_by ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''assigned_by'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.assigned_by) ;
END IF;
IF NEW.justification_now NOTNULL AND OLD.justification_now NOTNULL
AND
NEW.justification_now <> OLD.justification_now
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_now'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_now) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_now'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_now) ;
END IF;
IF NEW.justification_now ISNULL AND OLD.justification_now NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_now'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_now) ;
END IF;
IF NEW.justification_now NOTNULL AND OLD.justification_now ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_now'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_now) ;
END IF;
IF NEW.justification_1yr NOTNULL AND OLD.justification_1yr NOTNULL
AND
NEW.justification_1yr <> OLD.justification_1yr
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_1yr'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_1yr) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_1yr'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_1yr) ;
END IF;
IF NEW.justification_1yr ISNULL AND OLD.justification_1yr NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''justification_1yr'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.justification_1yr) ;
END IF;
IF NEW.justification_1yr NOTNULL AND OLD.justification_1yr ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''justification_1yr'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.justification_1yr) ;
END IF;
IF NEW.cust_asn NOTNULL AND OLD.cust_asn NOTNULL AND
NEW.cust_asn <> OLD.cust_asn
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''cust_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.cust_asn) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''cust_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.cust_asn) ;
END IF;
IF NEW.cust_asn ISNULL AND OLD.cust_asn NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''cust_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.cust_asn) ;
END IF;
IF NEW.cust_asn NOTNULL AND OLD.cust_asn ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''cust_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.cust_asn) ;
END IF;
IF NEW.comments NOTNULL AND OLD.comments NOTNULL AND
NEW.comments <> OLD.comments
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''comments'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.comments) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''comments'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.comments) ;
END IF;
IF NEW.comments ISNULL AND OLD.comments NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''comments'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.comments) ;
END IF;
IF NEW.comments NOTNULL AND OLD.comments ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''comments'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.comments) ;
END IF;
IF NEW.other_reference NOTNULL AND OLD.other_reference NOTNULL AND
NEW.other_reference <> OLD.other_reference
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''other_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.other_reference) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''other_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.other_reference) ;
END IF;
IF NEW.other_reference ISNULL AND OLD.other_reference NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''other_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.other_reference) ;
END IF;
IF NEW.other_reference NOTNULL AND OLD.other_reference ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''other_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.other_reference) ;
END IF;
IF NEW.parent_asn NOTNULL AND OLD.parent_asn NOTNULL AND
NEW.parent_asn <> OLD.parent_asn
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''parent_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.parent_asn) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''parent_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.parent_asn) ;
END IF;
IF NEW.parent_asn ISNULL AND OLD.parent_asn NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''parent_asn'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.parent_asn) ;
END IF;
IF NEW.parent_asn NOTNULL AND OLD.parent_asn ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''parent_asn'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.parent_asn) ;
END IF;
IF NEW.status NOTNULL AND OLD.status NOTNULL AND
NEW.status <> OLD.status
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''status'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.status) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''status'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.status) ;
END IF;
IF NEW.status ISNULL AND OLD.status NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''status'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.status) ;
END IF;
IF NEW.status NOTNULL AND OLD.status ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''status'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.status) ;
END IF;
IF NEW.purpose NOTNULL AND OLD.purpose NOTNULL AND
NEW.purpose <> OLD.purpose
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''purpose'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.purpose) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''purpose'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.purpose) ;
END IF;
IF NEW.purpose ISNULL AND OLD.purpose NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''purpose'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.purpose) ;
END IF;
IF NEW.purpose NOTNULL AND OLD.purpose ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''purpose'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.purpose) ;
END IF;
IF NEW.customer_reference NOTNULL AND OLD.customer_reference
NOTNULL AND
NEW.customer_reference <> OLD.customer_reference
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''customer_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.customer_reference) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''customer_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.customer_reference) ;
END IF;
IF NEW.customer_reference ISNULL AND OLD.customer_reference
NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''customer_reference'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.customer_reference) ;
END IF;
IF NEW.customer_reference NOTNULL AND OLD.customer_reference
ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''customer_reference'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.customer_reference) ;
END IF;
IF NEW.natblock NOTNULL AND OLD.natblock NOTNULL AND
NEW.natblock <> OLD.natblock
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''natblock'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.natblock::inet::text) ;
record_fields_old := record_fields_old || '','' ||
quote_ident(''natblock'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.natblock::inet::text) ;
END IF;
IF NEW.natblock ISNULL AND OLD.natblock NOTNULL
THEN
record_fields_old := record_fields_old || '','' ||
quote_ident(''natblock'');
record_values_old := record_values_old || '','' ||
quote_literal(OLD.natblock::inet::text) ;
END IF;
IF NEW.natblock NOTNULL AND OLD.natblock ISNULL
THEN
record_fields_new := record_fields_new || '','' ||
quote_ident(''natblock'');
record_values_new := record_values_new || '','' ||
quote_literal(NEW.natblock::inet::text) ;
END IF;
query_string_old := query_string_old || ''('' ||
record_fields_old || '') VALUES('' ||
record_values_old || '')'';
EXECUTE query_string_old;
query_string_new := query_string_new || ''('' ||
record_fields_new || '') VALUES('' ||
record_values_new || '')'';
EXECUTE query_string_new;
RETURN new;
END IF;
END;'
LANGUAGE plpgsql;

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler(at)lerctr(dot)org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749


From: Joe Conway <mail(at)joeconway(dot)com>
To: Larry Rosenman <ler(at)lerctr(dot)org>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: PL/pgSQL: Logging Trigger. Advice/comments/other?
Date: 2003-05-14 21:32:52
Message-ID: 3EC2B604.6090308@joeconway.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Larry Rosenman wrote:
> Ok, I finally finished this damn trigger to log changes to ONE frapping
> table.
>
> I'm wondering if any of you PL/pgSQL guru's out there see any better way
> to do
> this:

I haven't had the time to follow this thread, but depending on your
needs, maybe this will help (uses dblink_current_query() from
contrib/dblink):

create table networks_log(
id serial,
ts timestamp default now(),
sql text
);

create or replace function test_trig() returns trigger as '
declare
sqltext text;
begin
select into sqltext dblink_current_query();
insert into networks_log(sql) values (sqltext);
if TG_OP = ''INSERT'' or TG_OP = ''UPDATE'' then
return new;
else
return old;
end if;
end;
' language 'plpgsql';

create table networks(id serial, interface text);

create trigger networks_trig
after update or insert or delete on networks
for each row execute procedure test_trig();

insert into networks(interface) values ('eth0');
insert into networks(interface) values ('eth1');
update networks set interface = 'eth3' where id = 2;
delete from networks where id = 1;

regression=# select * from networks;
id | interface
----+-----------
2 | eth3
(1 row)

regression=# select ts::time, sql from networks_log;
ts | sql
-----------------+------------------------------------------------------
13:49:29.395334 | insert into networks(interface) values ('eth0');
13:49:34.818366 | insert into networks(interface) values ('eth1');
13:49:39.607128 | update networks set interface = 'eth3' where id = 2;
13:49:42.797973 | delete from networks where id = 1;
(4 rows)

HTH,

Joe


From: Larry Rosenman <ler(at)lerctr(dot)org>
To: Joe Conway <mail(at)joeconway(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: PL/pgSQL: Logging Trigger. Advice/comments/other?
Date: 2003-05-14 21:41:18
Message-ID: 485430000.1052948478@lerlaptop-red.iadfw.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

--On Wednesday, May 14, 2003 14:32:52 -0700 Joe Conway <mail(at)joeconway(dot)com>
wrote:

> Larry Rosenman wrote:
>> Ok, I finally finished this damn trigger to log changes to ONE frapping
>> table.
>>
>> I'm wondering if any of you PL/pgSQL guru's out there see any better way
>> to do
>> this:
>
> I haven't had the time to follow this thread, but depending on your
> needs, maybe this will help (uses dblink_current_query() from
> contrib/dblink):
[snip]
Oooohhhhh.... This looks promising. (now, can I migrate the damn 7.2.1
to 7.3.2????).

Thanks Joe!

LER

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler(at)lerctr(dot)org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749