s-s-rS 报告版本控制

Posted

技术标签:

【中文标题】s-s-rS 报告版本控制【英文标题】:s-s-rS Reports Versioning 【发布时间】:2010-11-01 10:35:05 【问题描述】:

我正在寻找一种从我的 s-s-rS 报告中获取版本控制信息的方法。我有几个环境,希望能够比较在这些环境中部署的报告版本。在 SSIS 中,这非常容易,因为每个 SSIS 包在修改和保护时都会获得一个新版本。有没有类似的报道?

【问题讨论】:

【参考方案1】:

不幸的是,目前没有类似于 RDL 文件的 dll 程序集版本的内置功能。

获取某种版本信息的唯一方法是通过 C# 或 VB.Net 在服务器上查询 RDL 文件的最后修改日期。您可以使用 ReportingServices 网络服务来做到这一点。

您还可以实现一个自定义函数,每次修改 RDL 文件时将数据库中的某些字段更新为当前日期。

所有文件修改信息的问题:你仍然不知道哪个版本在哪个服务器上,你只知道它是什么时候上传/修改的。

有关更多信息,请参阅以下页面 - 遗憾的是没有解决方案:

s-s-rS 2005 Can I dynamically determine when .rdl file was last modified .RDL "Version" properties like in ".DTSX" files

【讨论】:

非常感谢您的反馈,我担心会是这样。有时很难理解为什么 MSFT 在设计他们的产品时如此无关紧要,但这就是生活。 :) 别让我开始 - s-s-rS 并不是唯一与最佳实践不一致的创意 ;-)【参考方案2】:

在我的报告中,我创建了一个名为 Version 的变量并将其设为字符串数据类型(并将其移至变量列表的顶部)。每次更改报告时,我都会根据Semantic Versioning 更新版本变量。

然后,我可以查询我的报表服务器并查看 ExecutionLog 表的 Parameter 字段,我可以看到运行的版本。从技术上讲,我在一个写入另一个表的 SSIS 作业中处理所有这些,但这有点超出了这里的范围。

【讨论】:

在我们的报告中,我还创建了一个版本变量,但我们将其值设置为 $Revsion$。每次提交新修订时,CVS 或 SVN(我认为是 GIT)都会自动更新此值。这是一种无需手动维护即可快速轻松地识别 RDL 版本的方法。 @CorryS,我知道如何使用 SVN 自动道具。但是您实际上是如何读取并将其设置在变量中的?【参考方案3】:

似乎仍然没有好的解决方案。 如果您使用默认值创建隐藏参数“版本”,您可以使用构建任务来修改其在 .rdl 文件中的值,例如带有源代码控制变更集编号的修订部分。 遗憾的是,您可能需要另一个 Visual Studio 项目来放置此构建任务,因为报告项目类型似乎无法使用。

您还可以创建内联代码或可以进行一些查找的程序集。

廉价的次优替代方案: 使用报告数据库中的最后修改日期:

    Select 
    Name,
    Path,
    CreationDate, 
    ModifiedDate, 
    ModUser.UserName AS ModUser,
    CAST(catalog.parameter as xml).value(/Parameters[1]/Parameter[Name="Version"][1]/Values[1]/Value[1]','NVARCHAR(20)') as Version
   FROM Reportserver.dbo.Catalog
   INNER JOIN ReportServer.dbo.Users ModUser on Moduser.UserID = ModifiedByID
   WHERE Type = 2

并将日期转换为修订号... 但对跨不同服务器实例的版本没有帮助。

【讨论】:

【参考方案4】:

报表服务器 dbo.Catalog 表同时具有 CreationDate 和 ModifiedDate。

作为调查的一部分,我整理了一个查询以列出 RDL 文件中的查询并对其执行简单的 CHECKSUM 以方便检查偏差。 您当然可以更简单地对整个 Content 字段执行相同操作,或者使用真正的 xml 处理更好地打开 XML。

希望对你有所帮助;

DECLARE @reftextstart VARCHAR(255);
DECLARE @reftextend VARCHAR(255);

SELECT @reftextstart = '%<CommandText>%';
SELECT @reftextend = '</CommandText>';


SELECT SQ2.Path,
       SQ2.Name,
       SQ2.CreationDate,
       SQ2.ModifiedDate,
       ReportQuery,
       CHECKSUM(ReportQuery) ReportQueryChecksum
FROM
(
    SELECT SQ.Path,
           SQ.Name,
           SQ.CreationDate,
           SQ.ModifiedDate,
           CASE PATINDEX(@reftextstart, Report)
               WHEN 0 THEN
                   N''
               ELSE
                   SUBSTRING(
                                Report,
                                PATINDEX(@reftextstart, Report) + LEN(@reftextstart) - 2,
                                CHARINDEX(
                                             @reftextend,
                                             SUBSTRING(
                                                          Report,
                                                          PATINDEX(@reftextstart, Report) + LEN(@reftextstart) - 2,
                                                          1024
                                                      )
                                         ) - 1
                            )
           END ReportQuery
    FROM
    (
        SELECT TOP 1000
               [Path],
               [Name],
               [CreationDate],
               [ModifiedDate],
               [ExecutionTime],
               CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), Content)) Report
        FROM [ReportServer].[dbo].[Catalog]
        WHERE Name IN ( N'Report1', N'Report2' )
    ) SQ
) SQ2
ORDER BY [Path],
         Name;

【讨论】:

【参考方案5】:

我为我的客户尝试了这个解决方案: 用记事本打开.rdl文件,在第一行添加注释并保存,如:

<?xml version="1.0" encoding="utf-8"?>
<!--
=============================================
Author:             My Name (My Company)
CHANGE date:        Release Date
Description:        Short description
Current Version:    Ver x.x.x
Vx.x.x:             Version change history
=============================================
-->
<Report MustUnderstand="df" xmlns=...

希望对大家有所帮助

【讨论】:

以上是关于s-s-rS 报告版本控制的主要内容,如果未能解决你的问题,请参考以下文章

版本控制报告

Bate版本控制报告

版本控制报告

版本控制报告

版本控制报告

版本控制报告