【发布时间】:2025-12-05 23:00:01
【问题描述】:
目标
我的目标是创建启用审计功能(审计维度)的 SSIS (ETL) 模板。我发现了一些实现审计维度的方法,这些方法如下所述,并附有一些参考链接:
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