在当今的信息技术领域,无论是ERP系统、工作流应用、CRM工具还是任何数据库系统,审计都已成为这些系统不可或缺的一部分。审计可以帮助实现以下方面:
实现数据审计的方法有很多,但在表的触发器中添加审计逻辑是最高效的方法,同时也便于维护。
创建了一个工具(存储过程),它可以为表生成审计触发器,并将审计数据加载到整个应用程序的单个表中。
还可以根据应用程序的需要定制存储过程。在几个项目中使用了这个工具,节省了大约80%的编码工作量。相信可以在几天内使用这个工具在整个项目中实现审计跟踪。
此外,还上传了示例表和测试数据,这将有助于理解审计跟踪。
这个审计工具将在单个表中跟踪整个应用程序的审计数据,便于生成审计报告。请参阅下面的快照“带有示例数据的审计日志表”。
审计工具还将在审计表中跟踪以下信息,这些信息将有助于生成用户友好的报告:
任何表的更改都不会影响应用程序审计跟踪,审计触发器能够动态读取列并将数据加载到审计表中。
对于更新操作,可以只将修改后的数据加载到审计表中。
将跟踪表的主列名称和数据作为记录标识符,这可以通过在审计配置表中配置特定列作为记录标识符来覆盖。例如,可以在审计配置表中配置“销售人员名称”,在这种情况下,触发器将使用“销售人员名称”作为记录标识符,而不是“销售人员ID”。
触发器可以访问外键引用表并跟踪数据。以下面的例子为例,在更新“销售人员”表时,它可以通过使用“地区ID”从“销售地区”表中提取“地区名称”,从而为数据审计提供完整的信息。
为了实现审计,需要创建和配置以下审计表。让了解每个表的重要性。
下载附件(AuditTool.Zip),并创建以下提到的审计表。
CREATE TABLE [Audit].[AuditCategory] (
-- 列定义
);
CREATE TABLE [Audit].[AuditSubCategory] (
-- 列定义
);
CREATE TABLE [Audit].[AuditLogDecodeTableMapping] (
-- 列定义
);
CREATE TABLE [Audit].[AuditActionType] (
-- 列定义
);
CREATE TABLE [Audit].[AuditLogData] (
-- 列定义
);
创建函数:
CREATE FUNCTION Audit.GenerateDynamicQuery (
-- 参数定义
)
RETURNS TABLE
AS
BEGIN
-- 函数实现
END
创建审计存储过程以创建审计触发器:
CREATE PROCEDURE Audit.Generate_AuditTrigger_For_Insert (
-- 参数定义
)
AS
BEGIN
-- 存储过程实现
END
CREATE PROCEDURE Audit.Generate_AuditTrigger_For_Update (
-- 参数定义
)
AS
BEGIN
-- 存储过程实现
END
CREATE PROCEDURE Audit.Generate_AuditTrigger_For_Delete (
-- 参数定义
)
AS
BEGIN
-- 存储过程实现
END
生成审计触发器并部署它。
使用示例数据进行实施培训:
下载示例附件(AuditToolSample.Zip),并创建以下示例表。
CREATE TABLE [Sales].[CountryRegion] (
-- 列定义
);
CREATE TABLE [Sales].[SalesTerritory] (
-- 列定义
);
CREATE TABLE [Sales].[SalesPerson] (
-- 列定义
);
在以下审计表中配置示例表信息。
INSERT INTO [Audit].[AuditCategory] (
-- 插入数据
)
INSERT INTO [Audit].[AuditSubCategory] (
-- 插入数据
);
INSERT INTO [Audit].[AuditLogDecodeTableMapping] (
-- 插入数据
);
INSERT INTO [Audit].[AuditActionType] (
-- 插入数据
);
生成审计触发器脚本并执行它。
EXEC Audit.Generate_AuditTrigger_For_Insert
'SalesPerson|SalesPersonInsertAudit,SalesTerritory|SalesTerritoryInsertAudit,CountryRegion|CountryRegionInsertAudit',
'Jash',
'Sales',
'True';
EXEC Audit.Generate_AuditTrigger_For_Update
'SalesPerson|SalesPersonUpdateAudit,SalesTerritory|SalesTerritoryUpdateAudit,CountryRegion|CountryRegionUpdateAudit',
'Jash',
'Sales',
'True';
EXEC Audit.Generate_AuditTrigger_For_Delete
'SalesPerson|SalesPersonDeleteAudit,SalesTerritory|SalesTerritoryDeleteAudit,CountryRegion|CountryRegionDeleteAudit',
'Jash',
'Sales',
'True';