Eu usei com muito sucesso um modelo em que cada tabela tem uma cópia de auditoria - a mesma tabela com alguns campos adicionais (timestamp, ID do usuário, tipo de operação) e 3 gatilhos na primeira tabela para inserir/atualizar/excluir.
Acho que esta é uma maneira muito boa de lidar com isso, porque tabelas e gatilhos podem ser gerados a partir de um modelo e há pouca sobrecarga do ponto de vista de gerenciamento. A aplicação pode usar as tabelas para mostrar um histórico de auditoria para o usuário (leia -só).