我有两个 SSIS 包,它们作为更大的 SSIS 部署的一部分在夜间(通过 SQL Server 代理)运行,没有任何问题。一切都使用 Windows 身份验证,计划作业由系统管理员(好吧,我)拥有并作为SQL Server 代理服务帐户运行。
因此,数据基本上在source system ~> transit db ~> staging ~> NDS一夜之间消失了。
我关心的两个 SSIS 包分别处理一组特定数据的transit db ~> staging和staging ~> NDS部分。
域用户(非系统管理员)在 中执行某些操作source system并将有趣的数据推送到 中transit db,因此我需要一种方法来在工作时间内获取此更新的数据以更新NDS:决定此人触发的最简单方法该 ETL 是通过单击启用宏的 Excel 工作簿中的按钮来实现的,该工作簿通过 ODBC(使用 Windows 身份验证)连接到 SQL Server 并执行存储过程。
存储过程如下所示:
create procedure dbo.UpdateMaterialInventory
as
begin
execute msdb.dbo.UpdateMaterialInventory;
end
Run Code Online (Sandbox Code Playgroud)
[msdb] 中的“姐妹”存储过程如下所示:
create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
execute msdb.dbo.sp_start_job …Run Code Online (Sandbox Code Playgroud) sql-server permissions ssis sql-server-agent sql-server-2014
我不是 DBA,但事情就是这样,我必须戴上 DBA 的帽子,并在我的 SQL Server 实例上设置维护计划。
因此,有一段时间我一直让我的 SSIS 通宵进程运行执行 SQL 任务来执行备份 - 基本上运行master.dbo.xp_create_subdir以确保目标文件夹存在,然后BACKUP DATABASE [DbName] TO DISK = 'G:\Backups\DbName\DbName.bak' WITH INIT.
每当该任务失败时,其余的过程将中止,我会收到通知,第二天早上来时注意到事务日志的驱动器已满,因此我会手动截断它们并继续。 .. 直到故事重演并且事务日志再次超过可用磁盘空间。
“手动截断”脚本如下所示:
Run Code Online (Sandbox Code Playgroud)use Staging; alter database Staging set recovery simple alter database Staging set recovery full dbcc shrinkfile ('Staging_log', 0, truncateonly); go
所以我越来越厌倦了,我决定尝试正确地做事情,并按照这里的步骤创建一个实际的维护计划:
问题是,我以前从未这样做过,所以我有几个问题:
G:\Backups。那有意义吗?sql-server backup transaction-log maintenance-plans sql-server-2014
我构建了一个 SSIS ETL 来将各种数据源(一个来自 MySQL,两个来自 SQL Server)集成到一个单独的 SQL Server 关系和规范化数据库中,我称之为 [NDS]。
SSIS ETL 处理类型 2 更新,因此 [NDS] 生成代理键和 SCD 表包括一个 [_EffectiveFrom] 时间戳和一个可为空的 [_EffectiveTo] 列,并且对链接所有的自然键和漂亮的外键有约束数据一起。
现在,我想用它构建一个 SSAS 维度数据库,没过多久我意识到我正在为雪花模式设置自己:
所以我正在考虑添加一个新的 [DDS](关系)数据库,以创建实际的维度和事实表,这些表将为 SSAS 数据库提供 DSV。
这个 [DDS] 数据库将尽可能地非规范化,以便“扁平化”事实和维度(例如,[OrderHeaders]+[OrderDetails] 到 [Orders] 事实表,以及 [CustomerStores]+[Customers]+ [SalesReps] 到一些 [Customers] 维度表中) - 这样做不仅应该让我更容易在 SSAS 中构建维度层次结构,还应该更容易提出实际的星型模式。
不过我有几个问题:
我是在为 Big Mess™ 做好准备,还是在正确的轨道上?
sql-server ssas slowly-changing-dimension dimensional-modeling ssis-2014
我有一个源表,它看起来基本上是这样的:
实际的表有类似于 500 个编号的列(并没有真正计算它们 - 有各种各样的编号为 1-7 的字段,然后是另一个编号为 1-25,乘以 7 的字段)每个工作日(不,这不是我的设计) ,目前大约有 38,600 行(每周增加)。
我有一个 SSIS 包,它试图标准化这些数据......目前看起来像这样:

每个“源”从同一个源表中选择一组编号的列,UNION ALL 组件将 7 个源合并为一个,从而产生大约 258,900 行。
工作流的其余部分添加一些计算列,查找代理键(例如EmployeeCode用于查找EmployeeId,然后计算日期并用于查找 a TimeId),然后“修改”的行得到更新和“新的”被插入到规范化表中;未更改的行最终无处可去。
有没有更好的方法(例如减轻内存压力)来规范化源数据?
我的SSIS 控制流中有一个执行 SQL 任务,它在继续运行隔夜 ETL 之前备份了许多数据库:
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\DQ'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\master'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Metadata'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\NDS'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Staging'
GO
BACKUP DATABASE [DQ] TO DISK = N'G:\Backups\DQ\DQ.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'DQ', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [master] TO DISK = N'G:\Backups\master\master.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'master', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [Metadata] TO DISK = …Run Code Online (Sandbox Code Playgroud)