问题

如今商务智能应用广泛,对我们的商业愈加重要. 对新报表和的各种需求不断攀升. 自 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/

[译]SSRS 报表版本控制的更多相关文章

  1. Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据

    今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...

  2. [AX2012 R3]在SSRS报表中使用QR二维码

    AX2012是自带生成QR二维码的类,可以很方便的用在SSRS报表中,下面演示如何在RDP的报表中使用二维码,首先从定义临时表开始: 字段URL是要用于二维码的字符串,QrCode是container ...

  3. SSRS报表服务随笔(rdl报表服务)-创建一个简单的报表

    这段时间一直在敲rdl报表,在国内的不这么留在,在国外的话,还是挺流行的,国内的话,这方面的资料很少很少,也踏过不少坑 先从SSRS了解起,SSRS全称 SQL Server Reporting Se ...

  4. [AX2012]在SSRS报表中获取从Menuitem传入的记录

    在较早版本的AX中我们运行一个报表时会用到类RunBaseReport,从它扩展一个子类,再由它运行报表,一个典型的Axapta3中的例子: class ReportProdInfo extends ...

  5. SSRS 报表 如何加参数

    SSRS 报表 如何加参数 连接上以后出现一个问题 就是给报表加上参数以后报表不断刷新,跟上次那个报表刷新是同样的问题.那么下面我们来解决一下. 1. 这是给报表添加默认参数进入页面后就不断的刷新刷新 ...

  6. SSRS 报表 递归列表

    SSRS 报表 递归列表 .需要数据集合中两个必备字段 ID PID 1.添加数据集合,在图上标记的地方点击右键添加数据集合,根据需求自己编写 2.点击插入选项卡 中的 矩阵  有两种方式 一种是 矩 ...

  7. SSRS 报表 如何匿名查看

    SSRS 报表 如何匿名查看 昨晚一直研究怎么能匿名访问报表然后给客户看呢? 研究了好几种办法 我试过的分为三种,其中推荐我认为相对可控一点. .修改SSRS配置文件来禁止他验证登陆用户权限 操作过的 ...

  8. SSRS报表-级联筛选参数刷新后不能默认全选 -问题解决方案

    好久没有写博客了,最近更新完善修复了SSRS报表的一些问题,和大家分享. 问题描述: 报表中,区域->专区->省份->地级市 此四个筛选参数是联动的,在DataSet中前一父级参数作 ...

  9. SSRS 报表开发过程中,除数为0的处理

    这里仅供记录,方法并非原创 在SSRS报表开发过程中,我们经常会遇到除数为0的计算 一般来说,我们都是通过IIF来进行处理,比如: =IIF(B=0,0,A/B) 但实际效果,则是,如果B=0的时候, ...

随机推荐

  1. 【转】Virtualbox虚拟机配置安装CentOS 6.5图文教程

    http://www.111cn.net/sys/CentOS/61709.htm 什么是Virtualbox? VirtualBox 是一款开源虚拟机软件(注:跟vmware差不多).Virtual ...

  2. 1501 二叉树最大宽度和高度 (BFS+树的遍历)

    题目:http://www.wikioi.com/problem/1501/ 给你一颗二叉树,求该数的宽和高, 首先求出树的高,直接进行二叉树遍历,能够得到二叉树的高 然后是得到宽,本人采用的是一层一 ...

  3. Mysql++详解

    MySQL++数据库操作(1).mysqlpp::Connection con(false); //定义了mysql连接对象: (2).con.set_option(new mysqlpp::SetC ...

  4. c 结构体struct

    struct 定义初始化 #include<stdio.h> typedef struct stuInfo { ]; //姓名 int stuId; //学号 int age; //年龄 ...

  5. 刚开始学HTML自己做的,求大神些多多指教。

    !DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> ...

  6. U3d 手游优化概述

    移动平台瓶颈 体积小 芯片要求改 功耗小 影响计算系能 带宽小 传输方面受限 性能优化 资源方面 美术方面 自带地形(地形是非常占用资源的) a.控制地形的分辨率 b.地形高度图尺寸小于257 c.地 ...

  7. python把汉字转换成拼音实现程序

    python把汉字转换成拼音实现程序 文章一个简洁干的汉字转拼音 程序,复制下载就可以直接使用,有需要的同学可以参考一下下. #coding:utf-8 #基于python2.6 table = 'a ...

  8. SQL Server2012新特性概述

    公司最近要升级数据库,SQL Server 2008R2-->2012.再开始升级之前先找了点资料分析一下2012的新特性和功能,提前预热一下. 2012中主要关注一下三个领域: 性能:改进的核 ...

  9. [SAP] 外部系统调用SAP web service用户验证的简单方法

    场景: 一个Java系统调用SAP系统提供的web service,除了根据WSDL生成的代理类,调用相应方法,传入相应参数外,还等需要使用SAP提供的用户信息进行身份验证,最简单的方法是在soap请 ...

  10. asp.net 分页的制作

    /// <summary> /// 数据分页方法 /// </summary> /// <param name="PageIndex">当前页& ...