CREATE OR REPLACE FUNCTION {{.SchemaName}}.{{.FunctionName}}() RETURNS trigger AS $body$ DECLARE m_funcname text = '{{.FunctionName}}'; m_user text; m_atevent integer; BEGIN -- Get current user m_user := {{.UserFunction}}::text; -- Skip audit for specific users if needed IF m_user IN ('noaudit', 'importuser') THEN IF (TG_OP = 'DELETE') THEN RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN RETURN NEW; END IF; END IF; {{- if .AuditInsert}} IF TG_OP = 'INSERT' THEN -- Record INSERT INSERT INTO {{.AuditSchema}}.atevent (tablename, tableprefix, rid_parent, changeuser, changedate, changetime, actionx) VALUES ('{{.TableName}}', {{.TablePrefix}}, new.{{.PrimaryKey}}, m_user, CURRENT_DATE, CURRENT_TIME, 1) RETURNING rid_atevent INTO m_atevent; {{- end}} {{- if .AuditUpdate}} ELSIF TG_OP = 'UPDATE' THEN -- Check if any audited columns changed IF ({{.UpdateCondition}}) THEN INSERT INTO {{.AuditSchema}}.atevent (tablename, tableprefix, rid_parent, changeuser, changedate, changetime, actionx) VALUES ('{{.TableName}}', {{.TablePrefix}}, new.{{.PrimaryKey}}, m_user, CURRENT_DATE, CURRENT_TIME, 2) RETURNING rid_atevent INTO m_atevent; -- Record column changes {{- range .UpdateColumns}} IF (old.{{.Name}} IS DISTINCT FROM new.{{.Name}}) THEN INSERT INTO {{$.AuditSchema}}.atdetail(rid_atevent, datacolumn, changedfrom, changedto) VALUES (m_atevent, '{{.Name}}', substr({{.OldValue}}, 1, 1000), substr({{.NewValue}}, 1, 1000)); END IF; {{- end}} END IF; {{- end}} {{- if .AuditDelete}} ELSIF TG_OP = 'DELETE' THEN -- Record DELETE INSERT INTO {{.AuditSchema}}.atevent (tablename, tableprefix, rid_parent, rid_deletedparent, changeuser, changedate, changetime, actionx) VALUES ('{{.TableName}}', {{.TablePrefix}}, old.{{.PrimaryKey}}, old.{{.PrimaryKey}}, m_user, CURRENT_DATE, CURRENT_TIME, 3) RETURNING rid_atevent INTO m_atevent; -- Record deleted column values {{- range .DeleteColumns}} INSERT INTO {{$.AuditSchema}}.atdetail(rid_atevent, datacolumn, changedfrom, changedto) VALUES (m_atevent, '{{.Name}}', substr({{.OldValue}}, 1, 1000), NULL); {{- end}} {{- end}} END IF; IF (TG_OP = 'DELETE') THEN RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN RETURN NEW; END IF; RETURN NULL; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Audit function % failed: %', m_funcname, SQLERRM; RETURN NULL; END; $body$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER; COMMENT ON FUNCTION {{.SchemaName}}.{{.FunctionName}}() IS 'Audit trigger function for table {{.SchemaName}}.{{.TableName}}';