Thank SD for your reply and suggestion. I have added the table structure
CREATE TABLE UAUDIT_LOG
(
TABLE_NAME VARCHAR(100) DEFAULT '',
PRIMARY_KEY_COLUMN_NAME VARCHAR(100) DEFAULT '',
PRIMARY_KEY_COLUMN_VALUE VARCHAR(100) DEFAULT '',
AUDIT_ACTION CHAR(1) DEFAULT '',
HOST_NAME VARCHAR(100) DEFAULT '',
APP_NAME VARCHAR(100) DEFAULT '',
AUDIT_USERID VARCHAR(100) DEFAULT '',
AUDIT_DATETIME TIMESTAMP DEFAULT NULL,
COLUMN_NAME VARCHAR(100) DEFAULT '',
COLUMN_OLD_VALUE VARCHAR(2000) DEFAULT '',
COLUMN_NEW_VALUE VARCHAR(2000) DEFAULT ''
);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
ON UAUDIT_LOG TO SYSDBA WITH GRANT OPTION;
but I was not able to successfully create the trigger
SET TERM ^ ;
CREATE OR ALTER TRIGGER TR_uAudit_Log_tSaleInvoice
ACTIVE
AFTER INSERT OR UPDATE OR DELETE
On tSaleInvoice
AS
DECLARE VARIABLE C_OP CHAR(1) = '?'
BEGIN
C_OP = CASE WHEN (INSERTING) THEN 'I' WHEN (UPDATING) THEN
'U' WHEN (DELETING) THEN 'D' END;
INSERT INTO uAUDIT_LOG
(TABLE_NAME, PRIMARY_KEY_COLUMN_NAME,
PRIMARY_KEY_COLUMN_VALUE,
AUDIT_ACTION, HOST_NAME, APP_NAME, AUDIT_USERID,
AUDIT_DATETIME,
COLUMN_NAME, COLUMN_OLD_VALUE, COLUMN_NEW_VALUE)
VALUES
('tSaleInvoice', 'iID', :new.iID,
:C_OP, RDB$GET_CONTEXT('SYSTEM', 'CLIENT_HOST'), 'C26',
CURRENT_USER, LOCAL_TIMESTAMP,
'iBuyerID', :old.iBuyerID, :new.iBuyerID);
END^
SET TERM ; ^
I get the following error:
Error: ***
IBPP::SQLException ***
Context: Statement::Prepare(
CREATE OR ALTER TRIGGER TR_uAudit_Log_tSaleInvoice
ACTIVE
AFTER INSERT OR UPDATE OR DELETE
On tSaleInvoice
AS
DECLARE VARIABLE C_OP CHAR(1) = '?'
BEGIN
C_OP = CASE WHEN (INSERTING) THEN 'I' WHEN (UPDATING) THEN 'U'
WHEN (DELETING) THEN 'D' END;
INSERT INTO uAUDIT_LOG
(TABLE_NAME, PRIMARY_KEY_COLUMN_NAME,
PRIMARY_KEY_COLUMN_VALUE,
AUDIT_ACTION, HOST_NAME, APP_NAME, AUDIT_USERID,
AUDIT_DATETIME,
COLUMN_NAME, COLUMN_OLD_VALUE, COLUMN_NEW_VALUE)
VALUES
('tSaleInvoice', 'iID', :new.iID,
:C_OP, RDB$GET_CONTEXT('SYSTEM', 'CLIENT_HOST'), 'C26',
CURRENT_USER, LOCAL_TIMESTAMP,
'iBuyerID', :old.iBuyerID, :new.iBuyerID);
END )
Message: isc_dsql_prepare failed
SQL Message : -104
Invalid token
Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 9, column 1
BEGIN
Total execution time: 0.017s
I might have missed something, if so please advise. Also, if it matters I am still using FB 2.5.
My understanding is that I will have to define this for each field in each table? 'iBuyerID', :old.iBuyerID, :new.iBuyerID);
Or is this generic code? and I had to leave 'colname', :old.column, :new.column); as it is?
Also, is it possible to have the audit table in a separate database altogether?
Kindly advise further
Thanks and regards
Bhavbhuti
>> old.cBk <> new.cBk
old.cBk DISTINCT FROM new.cBk
Regards,
Karol Bieniaszewski
--
You received this message because you are subscribed to the Google Groups "firebird-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to firebird-suppo...@googlegroups.com.
To view this discussion on the web, visit https://groups.google.com/d/msgid/firebird-support/eeadbcce-17d1-acc1-f37c-cd8c068f58c7%40gmail.com.
>> old.cBk <> new.cBk
old.cBk DISTINCT FROM new.cBk
Regards,
Karol Bieniaszewski
Thanks Karol but I guess this does not work in FB 2.5
For SD and Mark. I just went overboard with the variables and
made repetitive values right at the top
SET TERM ^ ;
CREATE OR ALTER TRIGGER TR_Audit_Log_tSaleInvoice for
tSaleInvoice
ACTIVE
AFTER INSERT OR UPDATE OR DELETE position 0
AS
DECLARE VARIABLE C_OP CHAR(1) = '?';
DECLARE VARIABLE I_ID ID;
DECLARE VARIABLE C_Table_Name Varchar(100) = 'tSaleInvoice';
DECLARE VARIABLE C_Primary_Key_Column_Name VarCHAR(100) = 'iID';
DECLARE VARIABLE C_App_Name VarCHAR(100) = 'C26';
DECLARE VARIABLE C_Host_Name VarCHAR(100);
DECLARE VARIABLE C_Audit_UserID VarCHAR(100) = CURRENT_USER;
DECLARE VARIABLE T_Audit_DateTime TIMESTAMP = CURRENT_TIMESTAMP;
BEGIN
C_OP = CASE WHEN (INSERTING) THEN 'I' WHEN (UPDATING) THEN 'U'
WHEN (DELETING) THEN 'D' END;
I_ID = CASE WHEN (INSERTING) THEN new.iID WHEN (UPDATING) THEN
old.iID WHEN (DELETING) THEN old.iID END;
C_Host_Name = RDB$GET_CONTEXT('SYSTEM', 'CLIENT_ADDRESS');
if (:C_OP = 'I' OR :C_OP = 'D' OR old.cBk <> new.cBk)
then
INSERT INTO uAUDIT_LOG
(TABLE_NAME, PRIMARY_KEY_COLUMN_NAME,
PRIMARY_KEY_COLUMN_VALUE,
AUDIT_ACTION, HOST_NAME, APP_NAME, AUDIT_USERID,
AUDIT_DATETIME,
COLUMN_NAME, COLUMN_OLD_VALUE, COLUMN_NEW_VALUE)
VALUES
(:C_Table_Name, :C_Primary_Key_Column_Name, :I_ID,
:C_OP, :C_Host_Name, :C_App_Name , :C_Audit_UserID,
:T_Audit_DateTime,
'cBk', old.cBk, new.cBk);
if (:C_OP = 'I' OR :C_OP = 'D' OR old.iBuyerID <>
new.iBuyerID) then
INSERT INTO uAUDIT_LOG
(TABLE_NAME, PRIMARY_KEY_COLUMN_NAME,
PRIMARY_KEY_COLUMN_VALUE,
AUDIT_ACTION, HOST_NAME, APP_NAME, AUDIT_USERID,
AUDIT_DATETIME,
COLUMN_NAME, COLUMN_OLD_VALUE, COLUMN_NEW_VALUE)
VALUES
(:C_Table_Name, :C_Primary_Key_Column_Name, :I_ID,
:C_OP, :C_Host_Name, :C_App_Name , :C_Audit_UserID,
:T_Audit_DateTime,
'iBuyerID', old.iBuyerID, new.iBuyerID);
END
^
SET TERM ; ^
Thanks and regards
Bhavbhuti
To view this discussion on the web, visit https://groups.google.com/d/msgid/firebird-support/4Pwkmm455jzky3%40smtp.poczta.onet.pl.
old.cBk IS DISTINCT FROM new.cBk
Andras
Thanks Andras. Implemented your and Karol's suggestion
Kind regards
Bhavbhuti
To view this discussion on the web, visit https://groups.google.com/d/msgid/firebird-support/3ce89898a8d14665a04a80d8ee9f5511%40mail3.mve.hu.
Any possibility the audit_log table is in a different database and stored as such from within the trigger?
Kind regards
Bhavbhuti