【问题标题】:How to design audit dimension in the data mart using SQL Server 2012如何使用 SQL Server 2012 在数据集市中设计审计维度
【发布时间】:2025-12-05 23:00:01
【问题描述】:

目标

我的目标是创建启用审计功能(审计维度)的 SSIS (ETL) 模板。我发现了一些实现审计维度的方法,这些方法如下所述,并附有一些参考链接:

SEQUENCE

Primary Key

Best way to get identity of inserted row?

环境:

  • 事实表中有数百万行,并且包运行几个 一天几次。
  • 增量 ETL 获取数千行。
  • SQL Server 2012 BI 版本用于 BI 解决方案。

DimAudit 表的简化架构:

CREATE TABLE [dw].[DimAudit] (
       [AuditKey] [int] IDENTITY(1 ,1) NOT NULL,
       [ParentAuditKey] [int] NOT NULL,
       [TableName] [varchar] (50) NOT NULL DEFAULT ('Unknown'),
       [PackageName] [varchar] (50) NOT NULL DEFAULT ('Unknown'),
       [ExecStartDate] [datetime] NOT NULL DEFAULT ( getdate()),
       [ExecStopDate] [datetime] NULL,
       [SuccessfulProcessingInd] [char] (1) NOT NULL DEFAULT ('N'),
 CONSTRAINT [PK_dbo.DimAudit] PRIMARY KEY CLUSTERED
(
       [AuditKey] ASC
)
) ON [PRIMARY]

ALTER TABLE [dw].[DimAudit]  WITH CHECK ADD  CONSTRAINT [FK_DimAudit_ParentAuditKey] FOREIGN KEY( [ParentAuditKey])
REFERENCES [dw]. [DimAudit] ( [AuditKey])
GO

ALTER TABLE [dw].[DimAudit] CHECK CONSTRAINT [FK_DimAudit_ParentAuditKey]
GO

主键选项:

在审计表中生成主键,然后查询AuditKey。

任务:主 SQL 审计生成密钥(SQL 任务)

INSERT INTO [dw].[DimAudit]
           (ParentAuditKey
           ,[TableName]
           ,[PackageName]
           ,[ExecStartDate]
           ,[ExecStopDate]
           ,[SuccessfulProcessingInd])
     VALUES
           (1
           ,'Master Extract Package'
           ,?
           ,?
           ,?
           ,'N')

SELECT AuditKey 
FROM [dw].[DimAudit] 
WHERE TableName = 'Master Extract Package' and ExecStartDT = ?  
/*
Last Parameter: ParameterSystem::StartTime
Result Set populates User::ParentAuditKey
*/

任务:主 SQL 审计结束(SQL 任务)

UPDATE  [dw]. [DimAudit]
SET    ParentAuditKey = AuditKey
       ,ExecStopDT = SYSDATETIME()
       ,SuccessfulProcessingInd= 'Y'
WHERE   AuditKey = ?

/*
Parameter: User::ParentAuditKey
*/

SEQUENCE 选项:

序列选项不选择主键 (AuditKey),而是使用下面的逻辑来创建下一个可用的 AuditKey。

CREATE SEQUENCE dbo . AuditID as INT
        START WITH 1
        INCREMENT BY 1 ;
GO

DECLARE @AuditID INTEGER ;
SET @AuditID = NEXT VALUE FOR dbo. AuditID ;

Best way to get identity of inserted row?

使用身份选项感觉有风险,因为 ETL 包可以并行执行。

问题

审计维度表和管理键的推荐做法是什么?

序列和主键选项可以完成这项工作;但是,我担心选择主键选项,因为包可以在相同的毫秒内执行(理论上),因此会存在一些主键。所以,Sequence 听起来是最好的选择。

在为数据集市创建 Audit Dimension 方面,我能做些什么更好的事情?

【问题讨论】:

    标签: sql-server tsql ssis etl data-warehouse


    【解决方案1】:

    您可以使用 OUTPUT 语法:

    INSERT INTO [dw].[DimAudit]
           (ParentAuditKey
           ,[TableName]
           ,[PackageName]
           ,[ExecStartDate]
           ,[ExecStopDate]
           ,[SuccessfulProcessingInd])
    OUTPUT inserted.AuditKey
    VALUES
           (1
           ,'Master Extract Package'
           ,?
           ,?
           ,?
           ,'N')
    

    或我个人使用的 SCOPE_IDENTITY():

    INSERT INTO Meta.AuditDim (
          Date,
          UserName,
          Source,
          SourceType,
          AuditType,
          ExecutionId,
          ExecutionHost,
          ParentAuditKey,
          FileID
        )
    VALUES (
          GETDATE(),
          CURRENT_USER,
          @Source,
          @SourceType,
          @AuditType,
          @ExecutionId,
          @ExecutionHost,
          @ParentAuditKey,
          @FileID
        );
    
    SELECT AuditKey FROM Meta.AuditDim WHERE AuditKey = SCOPE_IDENTITY();
    

    【讨论】: