In accordance with the above comments, it is recommended to add audits only to those tables that really require this.
Usually you want to audit the user of the application - in many cases, applications (for example, Web or SOA) can connect all users with the same credentials, so saving a database entry is pointless.
IMHO, the date created / last date updated / lastupdateby never give a complete picture, since you can only see who made the last change and did not see what was changed. If you are performing an audit, I would suggest that instead you audit the complete change using patterns such as trigger auditing. You can also avoid using triggers if your inserts / updates / deletes in your tables are encapsulated, for example. via Stored Procedures . True, audit tables will grow very large, but they, as a rule, will not be frequently requested (usually in a witch hunt), and can be archived, easily broken down by date (and can be made read-only). With a separate audit table, you will not need the DateCreated or LastDateUpdated , as this can be obtained. However, you still need the last user of the changes, because SQL will not be able to get the application user.
If you decide on logical deletions, I would avoid using a โstatusโ as a field indicating a logical deletion, since you probably have tables that model the state of the process (for example, payment status, etc.). Using bit or char , such as ActiveYN or IsActive , are common for logical deletions.
Logical deletions can be cumbersome, since all your queries will need to filter Active=N records, and storing deleted records in your transaction tables can make these tables more than necessary, especially in Many : Many / junction tables. Efficiency can also be affected, since a two-state field is unlikely to be selective enough to be useful in indexes. In this case, physical deletions with a full audit may make sense.