SedonaOffice SEFT Log Truncation/DB Growth Post SedonaOffice 6.2.0.17 - 6.2.0.21

00142997 / 00146413 / 00143478

As of SedonaOffice ver 6.2.0.17 The SEFT log is aggregating a lot of data to compensate for several of the changes Forte has made around EFT/ACH Transactions, response codes, timing, reversals, and Z transactions. Accounting for the various conditions, states, and codes of transactions requires regular check ins with Forte to validate data. Development is working to scale the information down more and morein each future release.

Customers that have a lot of transactions on the SO versions above may see their database grow due and need assistance with shrinking this particular table. This guide goes over the steps to do so.

NOTE: Before truncating the SEFT Log Table, ensure the customer has nightly backups in the event they have any Payment Processing issues that require review.

You can access the information via SSMS UI by 
Righ-clicking on the production database > Reports > Standard Reports > Disk Usage by Top Tables


Manual SEFT Log Script Check and Truncation below

-- Get table Space sizes

SELECT 

  t.NAME AS TableName,

  SUM(p.rows) AS RowCounts,

  SUM(a.total_pages) * 8 / 1024 AS TotalSpaceMB,

  SUM(a.used_pages) * 8 / 1024 AS UsedSpaceMB,

  ROUND(SUM(a.total_pages) * 8.0 / 1024 / 1024, 3) AS TotalSpaceGB,

  ROUND(SUM(a.used_pages) * 8.0 / 1024 / 1024, 3) AS UsedSpaceGB,

  ROUND((SUM(a.total_pages) - SUM(a.used_pages)) * 8.0 / 1024 / 1024, 3) AS FreeSpaceGB,

  CASE 

    WHEN SUM(a.total_pages) > 0 

    THEN ROUND((SUM(a.used_pages) * 100.0 / SUM(a.total_pages)), 2)

    ELSE 0 

  END AS UsedSpacePercentage

FROM sys.tables t

JOIN sys.indexes i ON t.OBJECT_ID = i.object_id

JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id

JOIN sys.allocation_units a ON p.partition_id = a.container_id

GROUP BY t.NAME

ORDER BY TotalSpaceGB DESC;

 

-- Get the Overall Databases Size summary

WITH DatabaseSpace AS (

  SELECT 

    SUM(CAST(size AS BIGINT) * 8.0 / 1024) AS AllocatedSizeMB,

    SUM(CAST(size AS BIGINT) * 8.0 / 1024 / 1024) AS AllocatedSizeGB

  FROM sys.database_files

),

UsedSpace AS (

  SELECT 

    SUM(a.total_pages) * 8.0 / 1024 AS UsedSizeMB,

    SUM(a.total_pages) * 8.0 / 1024 / 1024 AS UsedSizeGB

  FROM sys.allocation_units a

)

SELECT 

  DB_NAME() AS DatabaseName,

  ROUND(ds.AllocatedSizeMB, 2) AS AllocatedSizeMB,

  ROUND(ds.AllocatedSizeGB, 3) AS AllocatedSizeGB,

  ROUND(us.UsedSizeMB, 2) AS UsedSizeMB,

  ROUND(us.UsedSizeGB, 3) AS UsedSizeGB,

  ROUND(ds.AllocatedSizeMB - us.UsedSizeMB, 2) AS FreeSizeMB,

  ROUND(ds.AllocatedSizeGB - us.UsedSizeGB, 3) AS FreeSizeGB,

  ROUND((us.UsedSizeMB / ds.AllocatedSizeMB) * 100, 2) AS UsedPercentage

FROM DatabaseSpace ds, UsedSpace us;

 

--Action

--1. truncate SEFT_Service_Log table

 

--select * from ss_version --6.2.0.19

truncate table SEFT_Service_Log



If Customer has had issue occur more than once in 90 days they may benefit from the stored procedure Emeka D created

Create PROCEDURE dbo.Sp_TruncateSEFTLog

AS

BEGIN

  SET NOCOUNT ON;

 

  -- Clean up any existing temp tables

  IF OBJECT_ID('tempdb..#LargestTable') IS NOT NULL DROP TABLE #LargestTable;

  IF OBJECT_ID('tempdb..#DataBaseSummaryBefore') IS NOT NULL DROP TABLE #DataBaseSummaryBefore;

  IF OBJECT_ID('tempdb..#DataBaseSummaryAfter') IS NOT NULL DROP TABLE #DataBaseSummaryAfter;

 

  -- Get the Largest table info

  SELECT TOP (1)

    t.NAME AS TableName,

    SUM(p.rows) AS RowCounts,

    ROUND(SUM(a.total_pages) * 8.0 / 1024 / 1024, 3) AS TotalSpaceGB,

    ROUND(SUM(a.used_pages) * 8.0 / 1024 / 1024, 3) AS UsedSpaceGB,

    ROUND((SUM(a.total_pages) - SUM(a.used_pages)) * 8.0 / 1024 / 1024, 2) AS FreeSpaceGB,

    CASE 

      WHEN SUM(a.total_pages) > 0 THEN ROUND((SUM(a.used_pages) * 100.0 / SUM(a.total_pages)), 2)

      ELSE 0 

    END AS UsedSpacePercentage

  INTO #LargestTable

  FROM sys.tables t

  JOIN sys.indexes i ON t.OBJECT_ID = i.object_id

  JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id

  JOIN sys.allocation_units a ON p.partition_id = a.container_id

  GROUP BY t.NAME

  ORDER BY TotalSpaceGB DESC;

 

  -- Check if the largest table is SEFT_Service_Log

  IF NOT EXISTS (SELECT 1 FROM #LargestTable WHERE TableName = 'SEFT_Service_Log')

  BEGIN

    SELECT 'Largest table is ' + TableName + '. Aborting!' AS Message FROM #LargestTable;

    RETURN;

  END

 

  -- Get the Overall Databases Size summary before Truncation

  ;WITH DatabaseSpace AS (

    SELECT SUM(CAST(size AS BIGINT) * 8.0 / 1024) AS AllocatedSizeMB,

        SUM(CAST(size AS BIGINT) * 8.0 / 1024 / 1024) AS AllocatedSizeGB

    FROM sys.database_files

  ),

  UsedSpace AS (

    SELECT SUM(a.total_pages) * 8.0 / 1024 AS UsedSizeMB,

        SUM(a.total_pages) * 8.0 / 1024 / 1024 AS UsedSizeGB

    FROM sys.allocation_units a

  )

  SELECT 

    DB_NAME() AS DatabaseName,

    ROUND(ds.AllocatedSizeGB, 3) AS AllocatedSizeGB,

    ROUND(us.UsedSizeGB, 3) AS UsedSizeGB,

    ROUND(ds.AllocatedSizeGB - us.UsedSizeGB, 3) AS FreeSizeGB,

    ROUND((us.UsedSizeMB / ds.AllocatedSizeMB) * 100, 2) AS UsedPercentage

  INTO #DataBaseSummaryBefore

  FROM DatabaseSpace ds, UsedSpace us;

 

  -- Truncate the SEFT_Service_Log table

  TRUNCATE TABLE SEFT_Service_Log;

 

  -- Introduce a 10-second delay to allow database space to update

  WAITFOR DELAY '00:00:10';

 

  -- Get the Overall Databases Size summary after Truncation

  WITH DatabaseSpace AS (

    SELECT SUM(CAST(size AS BIGINT) * 8.0 / 1024) AS AllocatedSizeMB,

        SUM(CAST(size AS BIGINT) * 8.0 / 1024 / 1024) AS AllocatedSizeGB

    FROM sys.database_files

  ),

  UsedSpace AS (

    SELECT SUM(a.total_pages) * 8.0 / 1024 AS UsedSizeMB,

        SUM(a.total_pages) * 8.0 / 1024 / 1024 AS UsedSizeGB

    FROM sys.allocation_units a

  )

  SELECT 

    DB_NAME() AS DatabaseName,

    ROUND(ds.AllocatedSizeGB, 3) AS AllocatedSizeGB,

    ROUND(us.UsedSizeGB, 3) AS UsedSizeGB,

    ROUND(ds.AllocatedSizeGB - us.UsedSizeGB, 3) AS FreeSizeGB,

    ROUND((us.UsedSizeMB / ds.AllocatedSizeMB) * 100, 2) AS UsedPercentage

  INTO #DataBaseSummaryAfter

  FROM DatabaseSpace ds, UsedSpace us;

 

  -- Gather Stats report

 

  -- Truncated table information

  SELECT 

    'Truncated Table' AS Information,

    TableName,

    RowCounts,

    RTRIM(CAST(TotalSpaceGB AS FLOAT)) AS TotalSpaceGB,

    RTRIM(CAST(UsedSpaceGB AS FLOAT)) AS UsedSpaceGB,

    RTRIM(CAST(FreeSpaceGB AS FLOAT)) AS FreeSpaceGB,

    RTRIM(CAST(UsedSpacePercentage AS FLOAT)) AS UsedSpacePercentage

  FROM #LargestTable;

 

  -- Database Summary before and after truncation

  SELECT 

    DatabaseName,

    RTRIM(CAST(AllocatedSizeGB AS FLOAT)) AS AllocatedSizeGB,

    RTRIM(CAST(UsedSizeGB AS FLOAT)) AS UsedSizeGB,

    RTRIM(CAST(FreeSizeGB AS FLOAT)) AS FreeSpaceGB,

    RTRIM(CAST(UsedPercentage AS FLOAT)) AS UsedPercentage,

    (SELECT 'SedonaOffice Version: ' + version FROM ss_version) AS [Version],

    'Before Truncation' AS Status

  FROM #DataBaseSummaryBefore

 

  UNION ALL

 

  SELECT 

    DatabaseName,

    RTRIM(CAST(AllocatedSizeGB AS FLOAT)) AS AllocatedSizeGB,

    RTRIM(CAST(UsedSizeGB AS FLOAT)) AS UsedSizeGB,

    RTRIM(CAST(FreeSizeGB AS FLOAT)) AS FreeSpaceGB,

    RTRIM(CAST(UsedPercentage AS FLOAT)) AS UsedPercentage,

    (SELECT 'SedonaOffice Version: ' + version FROM ss_version) AS [Version],

    'After Truncation' AS Status

  FROM #DataBaseSummaryAfter;

END

GO

Was this article helpful?
Thank you for your feedback!
User Icon

Thank you! Your comment has been submitted for approval.