问题
如今商务智能应用广泛,对我们的商业愈加重要. 对新报表和的各种需求不断攀升. 自 SQL Server 2008 R2的 Reporting Services (SSRS) 开始,微软视图为减轻IT团队的工作量,推出了报表工具 Report Builder 3.0. 在此之前建立复杂的报表必须用BIDS (就是 Visual Studio ,2012以后叫SSDT).现在报表都可以用 BIDS或者Report Builder建立. 因为可以使用两个工具创建修改的关系. 报表的版本控制愈加困难.
当报表只用BIDS创建的时候,版本控制非常简单. 你随便用哪个工具都可以搞定 .比如 TFS, SVN, 或者Git. 但是用Report Builder 就比较复杂了, 这个玩意没集成任何版本控制系统. 此外Report Builder可以在服务端直接设计和保存 ,这个就使得版本控制更困难了. Report Builder也可以存在本地.不过使用 共享数据集和数据源就有麻烦了.
为什么要进行版本控制
版本控制系统( version control system (VCS)) 有很多好处. 最大的好处就是可以还原先前版本. 一个好的版本控制系统也可以让你容易的查看版本的不同变化,meta-data等. 现在我们要同时用Report Builder和BIDS, 因此我们的版本控制不太容易了.
我找了很多资料,但是没有搞定. 我看到一个解决方案是把 RDLs 导出到SVN . 我看到一个解决方案是,把 RDL文件放到SVN,然后把开发服务器上报表的每个变动记录提交到VCS.不过解决方案和我的现有环境不匹配, 我们有些是用BIDS有些却是用 Report Builder, 有些在本地文件系统,有些则是在报表服务器.
我的SSRS版本控制系统
因为没找到适合的解决方案.我打算自己建立一个用来回复先前的版本.
这是一个非常简单的系统 . 我就实现了服务器上报表的变更记录 . 我在报表服务器数据库中添加了一个表格,用来记录报表的版本.(参见下面代码) . 然后我在 数据库上添加了 insert/update 触发器 .
版本记录表代码:
USE ReportServer
go
CREATE TABLE [dbo].[VersionStore](
[VersionItemId] [bigint] IDENTITY(1,1) NOT NULL,
[ItemId] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](425) NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[ModifiedBy] nvarchar(50),
[InsertedDate] [datetime] NOT NULL,
[Def] [xml] NULL,
CONSTRAINT [PK_VersionStore] PRIMARY KEY CLUSTERED
(
[VersionItemId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
触发器代码:
USE ReportServer
go
ALTER TRIGGER StoreVersion ON dbo.Catalog
FOR INSERT, UPDATE
AS
BEGIN
INSERT INTO ReportServer.dbo.VersionStore
( ItemId
,Name
,ModifiedDate
,ModifiedBy
,InsertedDate
,Def
)
SELECT ItemId
,[Name]
,ModifiedDate
,u.UserName ModifiedBy
,GETDATE() InsertedDate
,CONVERT(XML, CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), CONTENT))) Def
FROM Catalog C
INNER JOIN Users U
ON u.UserID = c.ModifiedByID
WHERE Content IS NOT NULL AND Type != 3
AND ItemID IN (
SELECT c.ItemID
FROM Catalog C
LEFT OUTER JOIN ( SELECT v1.ItemID
,MAX(v1.modifiedDate) modifiedDate
FROM VersionStore V1
GROUP BY ItemID
) V
ON C.ItemID = v.ItemID
WHERE Content IS NOT NULL
AND ( v.itemID IS NULL
OR v.modifiedDate != c.ModifiedDate
) )
END
最后,我建立了一个SSRS报表来显示,每个报表的版本变化同时包含他们RDL/RDS的完整XML . 如果需要恢复早期版本,用户只要复制之前版本的XML文档,然后贴在文件里面上传到服务器即可. 当然也可以用来对比等操作.
因为XML展示起来比较大,所以默认情况下隐藏,需要的时候展开即可.
资源:
原文地址:http://www.sqlservercentral.com/articles/Reporting+Services+(SSRS)/94119/