84 lines
3.1 KiB
Cheetah
84 lines
3.1 KiB
Cheetah
CREATE OR REPLACE FUNCTION {{qual_table .SchemaName .FunctionName}}()
|
|
RETURNS trigger AS
|
|
{{dollar_delimiter}}
|
|
DECLARE
|
|
m_funcname text = {{quote .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 {{quote_ident .AuditSchema}}.atevent (tablename, tableprefix, rid_parent, changeuser, changedate, changetime, actionx)
|
|
VALUES ({{quote .TableName}}, {{.TablePrefix}}, new.{{quote_ident .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 {{quote_ident .AuditSchema}}.atevent (tablename, tableprefix, rid_parent, changeuser, changedate, changetime, actionx)
|
|
VALUES ({{quote .TableName}}, {{.TablePrefix}}, new.{{quote_ident .PrimaryKey}}, m_user, CURRENT_DATE, CURRENT_TIME, 2)
|
|
RETURNING rid_atevent INTO m_atevent;
|
|
|
|
-- Record column changes
|
|
{{- range .UpdateColumns}}
|
|
IF (old.{{quote_ident .Name}} IS DISTINCT FROM new.{{quote_ident .Name}}) THEN
|
|
INSERT INTO {{quote_ident $.AuditSchema}}.atdetail(rid_atevent, datacolumn, changedfrom, changedto)
|
|
VALUES (m_atevent, {{quote .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 {{quote_ident .AuditSchema}}.atevent (tablename, tableprefix, rid_parent, rid_deletedparent, changeuser, changedate, changetime, actionx)
|
|
VALUES ({{quote .TableName}}, {{.TablePrefix}}, old.{{quote_ident .PrimaryKey}}, old.{{quote_ident .PrimaryKey}}, m_user, CURRENT_DATE, CURRENT_TIME, 3)
|
|
RETURNING rid_atevent INTO m_atevent;
|
|
|
|
-- Record deleted column values
|
|
{{- range .DeleteColumns}}
|
|
INSERT INTO {{quote_ident $.AuditSchema}}.atdetail(rid_atevent, datacolumn, changedfrom, changedto)
|
|
VALUES (m_atevent, {{quote .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;
|
|
{{dollar_delimiter}}
|
|
LANGUAGE plpgsql
|
|
VOLATILE
|
|
SECURITY DEFINER;
|
|
|
|
COMMENT ON FUNCTION {{qual_table .SchemaName .FunctionName}}() IS {{quote (printf "Audit trigger function for table %s" (qual_table .SchemaName .TableName))}}; |