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 报告版本控制的主要内容,如果未能解决你的问题,请参考以下文章