• Oh well. Here is the code. Sorry for putting it here....

    USE master

    GO

    CREATE DATABASE AuditTest

    GO

    USE AuditTest

    GO

    CREATE TABLE Customer

    (CustID int IDENTITYNOT NULL

    CONSTRAINT PK_Customer_On_CustID PRIMARY KEY CLUSTERED,

    CustFNamevarchar(20)NULL,

    CustMNamevarchar(35)NULL,

    CustLNamevarchar(35)NULL,

    CurrRecbitNOT NULLDEFAULT (1),

    LCHostvarchar(50)NOT NULLDEFAULT HOST_NAME(),

    LCUservarchar(50)NOT NULLDEFAULT USER,

    LCDatedatetime NOT NULLDEFAULT GETDATE()

    )

    GO

    CREATE TABLE CustomerAudit

    (CustAuditID int IDENTITYNOT NULL

    CONSTRAINT PK_CustomerAudit_On_CustAuditID PRIMARY KEY CLUSTERED,

    CustIDintNOT NULL,

    CustFNamevarchar(20)NULL,

    CustMNamevarchar(35)NULL,

    CustLNamevarchar(35)NULL,

    CurrRecbitNOT NULLDEFAULT (1),

    LCHostvarchar(50)NOT NULLDEFAULT HOST_NAME(),

    LCUservarchar(50)NOT NULLDEFAULT USER,

    LCDatedatetime NOT NULLDEFAULT GETDATE(),

    FinalDeletebitNOT NULLDEFAULT (0)

    )

    GO

    /* ============================================================================================== */

    /* = System Tables = */

    /* ============================================================================================== */

    CREATE TABLE AppErrorLog

    (EID int IDENTITY NOT NULL

    CONSTRAINT PK_AppErrorLog_On_EID PRIMARY KEY CLUSTERED,

    EDatedatetimeNOT NULL,

    EUservarchar(50)NULL,

    EMessagevarchar(1000)NULL,

    ESource varchar(150)NOT NULL,

    ENointNOT NULLDEFAULT 0,

    ESeverityintNOT NULLDEFAULT 0,

    ELineNo intNOT NULLDEFAULT 0,

    EHost varchar(50)NULL

    )

    GO

    /* ========================================================================================== */

    CREATE TABLE DBActivityLog

    (DBActivityID int IDENTITY NOT NULL

    CONSTRAINT PK_DBActivityLog_On_DBActivityID PRIMARY KEY CLUSTERED,

    DBASPROCvarchar(300)NULL,

    DBAMessagevarchar(1000)NULL,

    DBAAppNamevarchar(150)NULLDEFAULT APP_NAME(),

    DBAHost varchar(50)NULLDEFAULT HOST_NAME(),

    DBAUservarchar(50)NULLDEFAULT USER,

    DBADatedatetimeNULLDEFAULT GETDATE()

    )

    GO

    /* ======================================================================================== */

    CREATE TABLE MiscValues

    (MiscID intNOT NULL

    CONSTRAINT PK_MiscValues_On_MiscID PRIMARY KEY CLUSTERED,

    MiscDescvarchar(100)NULL,

    MiscValuevarchar(200)NULL,

    LCHostvarchar(50)NOT NULLDEFAULT HOST_NAME(),

    LCUservarchar(50)NOT NULL DEFAULT USER,

    LCDatedatetimeNOT NULL DEFAULT GETDATE()

    )

    GO

    /* ======================================================================================== */

    CREATE TABLE zSys_AuditTable

    (AuditTableID int IDENTITYNOT NULL

    CONSTRAINT PK_zSys_AuditTable_On_AuditTableID PRIMARY KEY CLUSTERED,

    SchemaNamevarchar(128)NOT NULL,

    TableNamevarchar(128)NOT NULL,

    AuditThisTablebitNOT NULLDEFAULT (0),

    LCHostvarchar(50)NOT NULLDEFAULT HOST_NAME(),

    LCUservarchar(50)NOT NULL DEFAULT USER,

    LCDatedatetimeNOT NULL DEFAULT GETDATE()

    )

    GO

    --Load all tables in the zSys_AuditTable table (determines dynamically which ones should be audited).

    INSERT INTO zSys_AuditTable

    SELECT CONVERT(varchar(128),TABLE_SCHEMA) AS SchemaName, CONVERT(varchar(128),TABLE_NAME) AS TableName, 1 AS AuditThisTable, HOST_NAME() AS LCHost, USER as LCUser, GETDATE() AS LCDate

    FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_TYPE<>'VIEW' AND TABLE_NAME <> 'zSys_AuditTable' AND (TABLE_NAME NOT LIKE '%Audit')

    ORDER BY TABLE_NAME

    --Reset these as unaudited.

    UPDATE zSys_AuditTable

    SET AuditThisTable=0

    WHERE SchemaName='dbo' AND TableName IN ('AppErrorLog','DBActivityLog','MiscValues')

    INSERT INTO MiscValues VALUES (1,'Group Name','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (2,'Dept Name','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (3,'Addr1','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (4,'Addr2','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (5,'City','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (6,'ST','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (7,'Zip','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (8,'Phone','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (9,'Fax','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (10,'Manager','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (11,'Application Name','AuditExample',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (12,'ApplicationVersion','1.0',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (13,'ApplicationDescription','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (14,'DatabaseVersion','1.0',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (15,'DatabaseDescription','',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (16,'SMTPServerName','mail.mycompany.com',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (17,'DBMail Profile Name','SQL Server Agent Mail Profile',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (18,'ReplyEmailAddr','noreply@myemail.com',HOST_NAME(),USER,GETDATE())

    INSERT INTO MiscValues VALUES (19,'LogDBActivity','TRUE',HOST_NAME(),USER,GETDATE())-- log database activity (running of SPROCs, with their associated parameter values)

    INSERT INTO MiscValues VALUES (20,'LogAuditActivity','TRUE',HOST_NAME(),USER,GETDATE())-- log audit activity (record value changes sent to the Audit table)

    CREATE PROCEDURE dbo.usp_Read_Customer_All_Audit_Rec

    @custidint,

    @spstatintOUTPUT,

    @errmsgvarchar(200)OUTPUT,

    @recnintOUTPUT

    AS

    DECLARE @numrecs int

    DECLARE @mvaluevarchar(200) --log db activity

    DECLARE @pvalue varchar(1000) --log db activity

    DECLARE @dbactivityidadded int --id value of record inserted into DBActivityLog, if turned on

    DECLARE @continueproc bit --continue processing

    SET NOCOUNT ON

    SET @spstat = 1 -- go ahead and set to ok

    SET @errmsg = '' -- go ahead and set to ok

    SET @recn = 0 -- go ahead and set to ok

    SET @dbactivityidadded = 0 -- set to 0

    SET @continueproc = 1 -- set to ok

    BEGIN TRY

    --log db activity

    SET @pvalue = ''

    SET @pvalue = CONVERT(varchar(100),@custid)

    SELECT @mvalue=ISNULL(MiscValue,'') FROM MiscValues WHERE MiscDesc = 'LogDBActivity'

    if @mvalue = 'TRUE'

    BEGIN

    INSERT INTO DBActivityLog

    VALUES ('dbo.usp_Read_Customer_All_Audit_Rec','SPROC call - Params= ' + @pvalue,APP_NAME(),HOST_NAME(),USER,GETDATE())

    SET @dbactivityidadded = scope_identity()

    END

    if @continueproc = 1 --only continue if everything is ok

    BEGIN

    SELECT 0 AS CustAuditID,CustID,CustFName,CustMName,CustLName,CurrRec,LCHost,LCUser,LCDate, 0 AS FinalDelete

    FROM Customer (NOLOCK)

    WHERE CustID=@custid

    UNION ALL

    SELECT CustAuditID,CustID,CustFName,CustMName,CustLName,CurrRec,LCHost,LCUser,LCDate, FinalDelete

    FROM CustomerAudit (NOLOCK)

    WHERE CustID=@custid

    ORDER BY LCDate DESC

    SET @numrecs = @@rowcount

    if @numrecs=0

    BEGIN

    SET @spstat = -1

    SET @errmsg = 'No record selected'

    SET @recn = 0

    END

    END

    else

    BEGIN

    SET @errmsg = 'Encountered unknown error.'

    INSERT INTO AppErrorLog

    VALUES (GETDATE(), USER, @errmsg, 'dbo.usp_Read_Customer_All_Audit_Rec', 0, 0, 0, HOST_NAME())

    END

    RETURN @spstat

    END TRY

    BEGIN CATCH

    DECLARE@ErrorNoint,

    @Severityint,

    @Stateint,

    @LineNoint,

    @errmessagevarchar(1000)

    SELECT@ErrorNo = ERROR_NUMBER(),

    @Severity = ERROR_SEVERITY(),

    @State = ERROR_STATE(),

    @LineNo = ERROR_LINE(),

    @errmessage = ERROR_MESSAGE()

    SET @errmsg = CONVERT(varchar(200), @errmessage)

    SET @spstat = 0

    INSERT INTO AppErrorLog

    VALUES (GETDATE(), USER, @errmessage, 'dbo.usp_Read_Customer_All_Audit_Rec', @ErrorNo, @Severity, @LineNo, HOST_NAME())

    END CATCH

    GO

    /* ====================================================================================== */

    /* Create Trigger for table Customer to handle Last Change and/or Audit */

    CREATE TRIGGER dbo.TG_Trigger_On_Table_Customer

    ON dbo.Customer

    FOR INSERT, UPDATE, DELETE

    AS

    BEGIN TRY

    DECLARE @idvalint

    DECLARE @CountDelint

    DECLARE @CountInint

    DECLARE @logauditactivitybit

    DECLARE @mvaluevarchar(200)

    SELECT @CountDel = COUNT(*) FROM Deleted

    SELECT @CountIn = COUNT(*) FROM Inserted

    -- Do check to see if need to audit this table

    SET @logauditactivity = 0

    SELECT @mvalue=ISNULL(MiscValue,'') FROM MiscValues WHERE MiscDesc = 'LogAuditActivity'

    if @mvalue = 'TRUE' -- only if even turned on do we check for the individual table

    BEGIN

    if EXISTS(SELECT * FROM zSys_AuditTable WHERE SchemaName='dbo' AND TableName='Customer' AND AuditThisTable=1)

    SET @logauditactivity = 1 -- set to true

    else

    SET @logauditactivity = 0 -- set to false

    END

    if @CountDel = 0 and @CountIn >= 1-- inserted

    BEGIN

    BEGIN TRANSACTION

    UPDATE Customer

    SET LCDATE = GETDATE(),

    LCUSER = USER,

    LCHOST = HOST_NAME()

    FROM dbo.Customer s

    JOIN inserted i

    ON i.CustID = s.CustID

    COMMIT TRANSACTION

    END

    IF @CountDel >= 1 and @CountIn = 0 and @logauditactivity = 1-- deleted

    BEGIN

    BEGIN TRANSACTION

    INSERT INTO CustomerAudit

    SELECT CustID, CustFName, CustMName, CustLName, CurrRec, LCHost, LCUser, LCDate, 0 AS FinalDelete FROM DELETED

    INSERT INTO CustomerAudit

    SELECT CustID, CustFName, CustMName, CustLName, CurrRec, HOST_NAME() AS LCHost, USER AS LCUser, GETDATE() AS LCDate, 1 AS FinalDelete FROM DELETED

    COMMIT TRANSACTION

    END

    if @CountDel >= 1 and @CountIn >= 1-- updated

    BEGIN

    BEGIN TRANSACTION

    if @logauditactivity = 1

    BEGIN

    INSERT INTO CustomerAudit

    SELECT CustID, CustFName, CustMName, CustLName, CurrRec, LCHost, LCUser, LCDate, 0 AS FinalDelete FROM DELETED

    END

    UPDATE Customer

    SET LCDATE = GETDATE(),

    LCUSER = USER,

    LCHOST = HOST_NAME()

    FROM dbo.Customer s

    JOIN inserted i

    ON i.CustID = s.CustID

    COMMIT TRANSACTION

    END

    END TRY

    BEGIN CATCH

    DECLARE@ErrorNoint,

    @Severityint,

    @Stateint,

    @LineNoint,

    @errmessagevarchar(1000)

    SELECT@ErrorNo = ERROR_NUMBER(),

    @Severity = ERROR_SEVERITY(),

    @State = ERROR_STATE(),

    @LineNo = ERROR_LINE(),

    @errmessage = ERROR_MESSAGE()

    ROLLBACK TRAN

    INSERT INTO AppErrorLog

    VALUES (GETDATE(), USER, @errmessage, 'TG_Trigger_On_Table_Customer', @ErrorNo, @Severity, @LineNo, HOST_NAME())

    END CATCH

    GO

    /* Note: Run these one at a time to see what it is doing */

    INSERT INTO Customer VALUES ('John','Q','Public',1,HOST_NAME(),USER,GETDATE())

    SELECT * FROM Customer

    UPDATE Customer SET CustLName = 'Smith' WHERE CustID = 1

    SELECT * FROM Customer

    SELECT * FROM CustomerAudit

    UPDATE Customer SET CustLName = 'Johnson' WHERE CustID = 1

    SELECT * FROM Customer

    SELECT * FROM CustomerAudit

    DECLARE @st int

    DECLARE @rn int

    DECLARE @em varchar(200)

    EXEC dbo.usp_Read_Customer_All_Audit_Rec 1,@spstat=@st OUTPUT,@errmsg=@em OUTPUT,@recn=@rn OUTPUT

    SELECT @st as Status, @em as ErrorMessage

    DELETE FROM Customer WHERE CustID = 1

    DECLARE @st int

    DECLARE @rn int

    DECLARE @em varchar(200)

    EXEC dbo.usp_Read_Customer_All_Audit_Rec 1,@spstat=@st OUTPUT,@errmsg=@em OUTPUT,@recn=@rn OUTPUT

    SELECT @st as Status, @em as ErrorMessage

    SELECT * FROM DBActivityLog

    SELECT * FROM AppErrorLog