【问题标题】:Find SSIS Package last modified/deployed date - SQL Server查找 SSIS 包的上次修改/部署日期 - SQL Server
【发布时间】:2017-10-23 08:14:31
【问题描述】:

我想通过执行 SQL 查询来查找 SSIS 包的最后修改日期。例如,下面的查询以 desc 顺序返回过程的最后修改日期。我期待对 SSIS 包进行相同类型的查询。是否可以从 DB 中获取这些信息?

select 
    name,
    create_date,
    modify_date 
from sys.objects 
where type='P' 
order by modify_date desc

【问题讨论】:

  • 您将 SSIS 包保存在文件系统还是 MSDB 中?
  • 这可能会有所帮助:serverfault.com/questions/99681/…
  • 您使用的是 SQL Server 2008,您的部署模型是什么?

标签: sql-server sql-server-2008 ssis


【解决方案1】:

我不允许对最后一个答案发表评论,但在 SQL Server 2016 中,因为包可以单独部署,也可以作为完整项目部署(如果您使用)

USE SSISDB
GO
SELECT MAX(p.last_deployed_time) AS last_deployed_time
FROM   [internal].[projects] p
       INNER JOIN [internal].[packages] pk ON pk.project_id = p.project_id

那么您不会总是得到正确的答案,因为您正在查看项目的部署日期。

SSIS 包的版本控制似乎在 2016 年的项目级别而不是包级别,所以我不知道是否有办法找到特定包的确切部署日期。

请参阅https://www.timmitchell.net/post/2016/11/11/ssis-catalog-project-versioning/ 了解这方面的一些有用信息。

【讨论】:

    【解决方案2】:

    在 SSISDB 中,您可以查看在特定时间执行了哪个 VERSION_BUILD。 如果您使用代码存储库(TFS?),您可以找到哪个版本的包具有该 version_build,以及该版本何时存储在存储库中。那就是你想知道的修改日期。

    您需要的 sql 语句的 SSIS 部分可能是:

    use SSISDB
    
    select  top 50 
             xs.execution_path
            ,cast(xs.start_time as datetime2(0)) as start_time
            ,x.project_version_lsn
            ,p.version_build
    from    internal.executables x
    join    internal.executable_statistics xs on x.executable_id = xs.executable_id
    join    internal.packages p 
                    on  x.project_id = p.project_id 
                    and x.project_version_lsn = p.project_version_lsn
                    and x.package_name = p.name
    
    where   x.package_name = 'Package1.dtsx'
    and     x.executable_name = 'Package1'
    
    order by start_time desc
    

    如何查询您的代码存储库是您的下一个挑战。

    在包的代码视图中,在前 20 行中,您会发现如下内容:

    DTS:VersionBuild="62"
    

    如果只需要知道最新部署的版本是什么,不管是否实际执行,都可以查询:

    select  max(version_build) as latest_version_build
    from    internal.packages
    where   name = 'Package1.dtsx'
    

    【讨论】:

      【解决方案3】:

      根据这个答案,有几种方法:Can I tell the last modified date on an SSIS package from Integration Services.在 SO 上发帖,以及社区 wiki

      如果包存储在 MSDB 中,则不,唯一的日期/时间戳是创建日期。不跟踪修改日期。您需要在重新部署之前删除包以跟踪修改日期,这实际上只是将创建日期强制为您的重新部署日期。

      在 SQL 2005 中,存储在 MSDB 中的包的元数据存储在 msdb.dbo.sysdtspackages 和 msdb.dbo.sysdtspackages90 中,因此您可以在其中一个表上运行 SELECT 以查看您的包。对于 SQL 2008 及更高版本,表名为 sysssispackages。

      SELECT * from msdb.dbo.sysdtspackages90 WHERE name='mypackagename'

      如果您在服务器上的包位置是文件系统,那么您可以通过 Windows 资源管理器(或您想要使用的任何文件系统工具)获取包文件的修改日期。 SQL 2005 的路径是 [安装驱动器]:\Program Files\Microsoft SQL Server\90\DTS\Packages。将 90 替换为 SQL 2008 的 100,或 SQL 2012 的 110。

      否则,我认为您最好的选择是确保您的生产服务器上的安全性足够,以便只有那些应该部署软件包的人才能这样做,然后在您的开发环境中跟踪您的发布日期(源代码控制等) .不过,对于确保生产不会在不知情的情况下发生变化并没有多大作用....

      【讨论】:

        【解决方案4】:

        如果您使用 SQL Server 2012(或更高版本)并在 SSISDB 中部署您的包,那么以下代码应该可以工作。

        USE SSISDB
        GO
        SELECT MAX(p.last_deployed_time) AS last_deployed_time
        FROM   [internal].[projects] p
               INNER JOIN [internal].[packages] pk
                    ON  p.project_id = pk.project_id
        WHERE  pk.name = 'Package1.dtsx'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-02
          • 2021-01-22
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          相关资源
          最近更新 更多