02 January 2015

Alert and database log coexistence

While testing Database log functionality I found a tricky behaviour which can cause unwanted results.

Problem description
Alert is not generated, although Alert rule is enabled.

Steps
1. Create a new alert rule for Customers insert event
Accounts receivable > All customers > select Customer account field and right click > Create alert rule...

2. Add Customers table to Database log using a standard wizard
System administration > Setup > Database > Database log setup > New > Next > Open General ledger and select Customers

3. Create a new customer

4. Run Change based alerts job
System administration > Periodic > Alerts > Change based alerts

5. No alert is generated

Below you will find hints and solution description, however challenge yourself and try to repeat described steps and make assumptions :-)

Hints
Compare data in DatabaseLog table for CustTable before and after step 2.



Solution
Alert rule framework also uses DatabaseLog table to store setup.
When a new alert rule is created for a table - a record is inserted into DatabaseLog table (logType is equal to EventDelete or EventInsert or EventRenameKey or EventUpdate).
When a table is added to Database log using standard AX wizard all previously created database log setup records for the table are deleted and new records are created. It is done in \Classes\SysDatabaseLogWizard\doRun method
while select forupdate dblog
{
    if (SysDatabaseLogWizard::tableAllowed(dblog.LogTable))
    {
        dblog.delete();
    }
}
Alert rule is still available, however as Database log setup is lost, no alert is generated.

Exclude records with logType equal to EventDelete, EventInsert, EventRenameKey and EventUpdate to keep Alert rule setup
while select forupdate dblog
    where dblog.logType != DatabaseLogType::EventDelete
       && dblog.logType != DatabaseLogType::EventInsert
       && dblog.logType != DatabaseLogType::EventRenameKey
       && dblog.logType != DatabaseLogType::EventUpdate
{
    if (SysDatabaseLogWizard::tableAllowed(dblog.LogTable))
    {
        dblog.delete();
    }
}

3 comments:

  1. Hi Oleg,
    I did notice this DataBase table entries some time ago.
    Then I accidentally deleted all of them when I was deleting regurar logs.
    What is wired, it looks like alerts are still working good. I even made a test on the new insert rule. Alert works fine with DataBase entry and still work when I delete it.
    Did you have any more experience on that?

    ReplyDelete
    Replies
    1. Hi Frayday, did you delete all records in DatabaseLog table?

      Delete