Suppose there is a table which we want to audit. This table contains the following columns:
Column1, Column2, ..., Columnn
The column Column1 is assumed to be the primary key.
These columns are defined to have the following types:
Type1, Type2, ..., Typen
The Log Trigger works writing the changes (INSERT, UPDATE and DELETE operations) on the table in another, history table, defined as following:
As shown above, this new table contains the same columns as the original table, and additionally two new columns of type DATETIME: StartDate and EndDate. This is known as tuple versioning. These two additional columns define a period of time of "validity" of the data associated with a specified entity (the entity of the primary key), or in other words, it stores how the data were in the period of time between the StartDate (included) and EndDate (not included).
For each entity (distinct primary key) on the original table, the following structure is created in the history table. Data is shown as example.
Notice that if they are shown chronologically the EndDate column of any row is exactly the StartDate of its successor (if any). It does not mean that both rows are common to that point in time, since -by definition- the value of EndDate is not included.
There are two variants of the Log trigger, depending how the old values (DELETE, UPDATE) and new values (INSERT, UPDATE) are exposed to the trigger (it is RDBMS dependent):
Old and new values as fields of a record data structure
Old and new values as rows of virtual tables
According with the slowly changing dimension management methodologies, The log trigger falls into the following:
Source:1
Source:2
Typically, database backups are used to store and retrieve historic information. A database backup is a security mechanism, more than an effective way to retrieve ready-to-use historic information.
A (full) database backup is only a snapshot of the data in specific points of time, so we could know the information of each snapshot, but we can know nothing between them. Information in database backups is discrete in time.
Using the log trigger the information we can know is not discrete but continuous, we can know the exact state of the information in any point of time, only limited to the granularity of time provided with the DATETIME data type of the RDBMS used.
It should return the same resultset of the whole original table.
Suppose the @DATE variable contains the point or time of interest.
Suppose the @DATE variable contains the point or time of interest, and the @KEY variable contains the primary key of the entity of interest.
Suppose the @KEY variable contains the primary key of the entity of interest.
Since the trigger requires that primary key being the same throughout time, it is desirable to either ensure or maximize its immutability, if a primary key changed its value, the entity it represents would break its own history.
There are several options to achieve or maximize the primary key immutability:
Sometimes the Slowly changing dimension is used as a method, this diagram is an example:
The Log trigger was written by Laurence R. Ugalde3 to automatically generate history of transactional databases.
Log trigger on GitHub
"Database Fundamentals" by Nareej Sharma et al. (First Edition, Copyright IBM Corp. 2010) ↩
"Microsoft SQL Server 2008 - Database Development" by Thobias Thernström et al. (Microsoft Press, 2009) ↩
"R. Ugalde, Laurence; Log trigger". GitHub. Retrieved 2022-06-26. https://github.com/laurence-ugalde/log-trigger ↩