84 lines
2.9 KiB
Cheetah
84 lines
2.9 KiB
Cheetah
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}}'; |